數據庫中的任何類型的約束都具有唯一的約束名稱嗎?
我知道在創建表之後添加主鍵約束和外鍵約束是可能的,甚至被鼓勵,這樣程序員就可以控制約束的名稱。如果程序員在創建表時添加這些約束(沒有特定的添加約束語法),那麼數據庫引擎會為這些約束提供一個由隨機字元組成的名稱。數據庫引擎賦予這些“非顯式”約束的名稱取決於實現。
但是我的問題是:任何類型的約束在數據庫引擎中都有特定的名稱嗎?即使是 NOT NULL 約束?以後可以在“ALTER TABLE”命令中引用那些簡單的約束,如 NOT NULL 嗎?
我知道在創建表之後添加主鍵約束和外鍵約束是可能的,甚至被鼓勵,這樣程序員就可以控制約束的名稱。如果程序員在創建表時添加這些約束(沒有特定的添加約束語法),那麼數據庫引擎會為這些約束提供一個由隨機字元組成的名稱。
您是說在創建表時不能給出約束名稱嗎?這是不正確的:
create table foo(id integer primary key);
create table bar(id integer constraint pk_bar primary key);
select table_name, constraint_name from user_constraints;
表名 | CONSTRAINT_NAME :--------- | :-------------- 福 | SYS_C007856 酒吧 | PK_BAR
dbfiddle在這裡
但是我的問題是:任何類型的約束在數據庫引擎中都有特定的名稱嗎?即使是 NOT NULL 約束?以後可以在“ALTER TABLE”命令中引用那些簡單的約束,如 NOT NULL 嗎?
NOT NULL
約束完全相同:create table foo(id integer not null);
create table bar(id integer constraint nn_bar_id not null);
select table_name, constraint_name from user_constraints;
表名 | CONSTRAINT_NAME :--------- | :-------------- 福 | SYS_C007860 酒吧 | NN_BAR_ID
dbfiddle在這裡
以後可以在“ALTER TABLE”命令中引用那些簡單的約束,如 NOT NULL 嗎?
當然,就像任何其他約束一樣:
alter table bar drop constraint nn_bar_id;
dbfiddle在這裡
除了使用命名約束之外,您還可以在沒有任何名稱的列中添加/刪除 NOT NULL 約束。
假設我們有下表(Oracle):
CREATE TABLE t ( a numeric PRIMARY KEY, b numeric ) ; INSERT INTO t (a,b) VALUES (1, 2);
如果要更改表並強制列
b
僅保存NOT NULL
值,可以使用以下語句來完成(不需要命名約束):ALTER TABLE t MODIFY (b NOT NULL) ;
NULL
如果您在 column上已有值時嘗試此操作b
,則會收到錯誤消息:ORA-02296: 無法啟用 (xxxxxxxxxx) - 找到空值
如果您想將列改回以允許
NULL
值,您可以使用以下 DDL 來完成,這不需要您知道任何約束名稱:ALTER TABLE t MODIFY (b NULL) ;
dbfiddle在這裡