Oracle

數據庫中的任何類型的約束都具有唯一的約束名稱嗎?

  • March 27, 2017

我知道在創建表之後添加主鍵約束和外鍵約束是可能的,甚至被鼓勵,這樣程序員就可以控制約束的名稱。如果程序員在創建表時添加這些約束(沒有特定的添加約束語法),那麼數據庫引擎會為這些約束提供一個由隨機字元組成的名稱。數據庫引擎賦予這些“非顯式”約束的名稱取決於實現。

但是我的問題是:任何類型的約束在數據庫引擎中都有特定的名稱嗎?即使是 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在這裡

引用自:https://dba.stackexchange.com/questions/168206