在做表約束的時候,需要多個字段進行關聯來確定唯一索引:
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...