Mysql

MySQL中幾乎唯一的約束

  • June 14, 2020

在 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)
);

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