如何在布尔Mysql列上创建"唯一"约束?

ben*_*ail 19 mysql sql constraints

我想BOOLEAN在一个名为MySQL的表中添加一列is_default.在此列中,只能is_default设置一个记录true.

如何使用mysql将此约束添加到我的列?

谢谢!


UPDATE

如果它不是我应该添加的约束.我们如何在DB上处理这类问题?

Lar*_*tig 24

我认为这不是模拟单个默认值的最佳方式.

相反,我将保留IsDefault列,并创建一个单独的表,其中包含一行,只有一列可以使主表的主键成为主.在此表中,您可以放置​​标识默认记录的PK值.

这样可以大大减少存储空间,并避免更新时临时没有默认值(或者,暂时具有两个默认值)的更新问题.

您有许多选项可以确保默认表中只有一行.

  • 有哪些选项可以确保默认表中只有一行? (11认同)

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)


a_h*_*ame 8

我们如何在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上运行.