ben*_*ail 19 mysql sql constraints
我想BOOLEAN在一个名为MySQL的表中添加一列is_default.在此列中,只能is_default设置一个记录true.
如何使用mysql将此约束添加到我的列?
谢谢!
UPDATE
如果它不是我应该添加的约束.我们如何在DB上处理这类问题?
Lar*_*tig 24
我认为这不是模拟单个默认值的最佳方式.
相反,我将保留IsDefault列,并创建一个单独的表,其中包含一行,只有一列可以使主表的主键成为主.在此表中,您可以放置标识默认记录的PK值.
这样可以大大减少存储空间,并避免更新时临时没有默认值(或者,暂时具有两个默认值)的更新问题.
您有许多选项可以确保默认表中只有一行.
Mar*_*ers 11
你不能在MySQL中有这样的约束.
但是,如果使用TRUE和NULL值而不是TRUE和FALSE,那么它将起作用,因为UNIQUE列可以有多个NULL值.请注意,这不适用于所有数据库,但它可以在MySQL中使用.
CREATE TABLE table1(b BOOLEAN UNIQUE);
INSERT INTO table1 (b) VALUES (TRUE); // Succeeds
INSERT INTO table1 (b) VALUES (TRUE); // Fails: duplicate entry '1' for key 'b'
INSERT INTO table1 (b) VALUES (FALSE); // Succeeds
INSERT INTO table1 (b) VALUES (FALSE); // Fails: duplicate entry '0' for key 'b'
INSERT INTO table1 (b) VALUES (NULL); // Succeeds
INSERT INTO table1 (b) VALUES (NULL); // Succeeds!
Run Code Online (Sandbox Code Playgroud)
我们如何在DB上处理这类问题?
在某些DBMS中,您可以创建部分索引.
在PostgreSQL中,这将是这样的:
CREATE UNIQUE INDEX only_one_true ON the_table (is_default) WHERE is_default
SQL Server 2008具有非常相似的语法.
在Oracle上它有点复杂但也可行:
CREATE UNIQUE INDEX only_one_true
ON the_table (CASE
WHEN is_default = 1 THEN 1
ELSE null
END)
Oracle解决方案可以在任何支持索引定义表达式的DBMS上运行.
| 归档时间: |
|
| 查看次数: |
11671 次 |
| 最近记录: |