Mysql
MySQL中幾乎唯一的約束
在 MySQL 5.7 中可能有一個鍵,它對於除一個之外的所有值都是唯一的。假設 -1 是
not assigned
萬用字元。是否可以有一個具有以下結構的表user | car | seat 1 | 1 | -1 2 | 1 | -1 3 | 1 | 2
這將允許
INSERT INTO table VALUES (4, 1, 3) INSERT INTO table VALUES (5, 1, -1)
失敗
INSERT INTO table VALUES (4, 1, 2)
同樣適用於更新。
您可以將生成的列用作:
create table t ( user int not null primary key , seat int not null , gen int generated always as ( case when seat = -1 then -1*user else seat end ) stored , constraint xx unique (gen) ); -- valid insert into t (user, seat) values (1,-1), (2,-1), (3,2), (4,3), (5,-1); -- invalid, Error: ER_DUP_ENTRY: Duplicate entry '2' for key 'xx' insert into t (user, seat) values (6, 2);
請注意,這假設使用者不是負數。
編輯:您也可以考慮將您的關係標準化為兩個:
CREATE TABLE users ( user int not null primary key , ... ); CREATE TABLE user_seats ( user int not null references users (user) , seat int not null primary key -- if a user can only occupy one seat , constraint ... unique (user) );