聯合約束主鍵 2020 08 27

2021-10-23 21:49:14 字數 917 閱讀 4956

在做表約束的時候,需要多個字段進行關聯來確定唯一索引:

create index 索引名 on 表名(欄位1, 欄位2);
上述只是簡單的兩個字段作為索引,如果此時需要再加乙個常見的is_del作為聯合約束主鍵,即當is_del<>1的時候和其他字段一起作為主鍵:

create unique index 索引名 on 表名

( nvl2(nullif(is_del,1),欄位1,null),

nvl2(nullif(is_del,1),is_del,null),

nvl2(nullif(is_del,1),欄位2,null)

);

解析:

1)當 is_del=1 時,nullif(is_del,1) 則返回null值, 即nvl2(nullif(is_del,1),欄位1,null), 返回的是null值,同理,另外兩個nvl2的表示式也是返回null值,因此,三個欄位都認為是null值,所以可以允許插入;

2)當 is_del<>1 時,nullif(is_del,1)則返回 is_del值,即nvl2(nullif(is_del,1),欄位1,null),返回的值是字段1的值,同理,另外兩個nvl2的表示式返回的分別是is_del,欄位2的值,這時候進行判斷是否符合唯一性約束。

3)null指的是空值,或者非法值。

nvl (expr1, expr2)->expr1為null,返回expr2;不為null,返回expr1。注意兩者的型別要一致

nvl2 (expr1, expr2, expr3) ->expr1不為null,返回expr2;為null,返回expr3。expr2和expr3型別不同的話,expr3會轉換為expr2的型別;

所以對於需要兩個欄位+乙個字段特定值,組成的聯合約束主鍵,可以使用上述方法進行建立。

Django model 中設定聯合約束和聯合索引

在django model中對一張表的幾個字段進行聯合約束和聯合索引,例如在購物車表中,登入的使用者和商品兩個欄位在一起表示唯一記錄。django model中購物車表 class cart models.model user models.foreignkey myuser,verbose nam...

MySQL聯合主鍵儲存 mysql聯合主鍵

聯合主鍵就是多個表的主鍵聯合起來作為乙個表的主鍵 這個是摘抄的別人的 create table products description products id int 11 not null,language id int 11 not null default 1 products name v...

oracle復合約束

復合約束 每個月的報表 2017 6 2018 6 2018 7 建立報告表 create table tb repo year char 4 mon char 2 將需要整合到一起作為符合約束的鍵放到一起設定約束 unique year,mon insert into tb repo values...