alter table:只允许唯一或空

时间:2013-09-05 12:18:36

标签: mysql

我有一个现有的mysql表,我想设置一个字段(varchar),使其必须是唯一的或空的(默认情况下)。因此,当用户未输入值时,其为空,否则用户必须输入唯一值。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

根据我的阅读标准,不应该在表中有一个允许空值的列并且具有唯一约束;如果是的话,它归结为一个特殊的mysql引擎(这将导致其他地方的不可预测/意外行为也是imho)

此外,您的问题似乎与此相反。

MySQL: UNIQUE, but DEFAULT NULL - allowed by creating of table. More than 1 NULL is allowed to insert. Why?

然而,您可以使用触发器强制执行此操作,您可以在插入/更新时编写触发器以检查该值是否已存在,并立即删除它。

答案 1 :(得分:1)

MySQL包含一个约束类型UNIQUE,允许这样做。如果您声明列UNIQUE并允许其中包含NULL值,则所有值都将被强制为唯一,除非它们是NULL值。如果要防止存储空字符串(''),则必须在代码级别对其进行管理,因为MySQL会将其视为另一个字符串并在UNIQUE列中允许它一次。如果没有值传递给这样的列,它将自动默认为NULL,但您也可以在将值传递给数据库之前在代码中以编程方式指定NULL(不是引号)。

对于本文的其余部分,我将假设表的名称为tablename,列的名称为columnname,varchar字段的大小为255

如果您想修改现有表格,而不是创建一个新表格:

如果列不支持空值:

ALTER TABLE tablename ALTER COLUMN columnname VARCHAR(255) NULL

添加唯一约束:

ALTER TABLE tablename ADD CONSTRAINT un_tablename_column UNIQUE (columnname)`

(我总是说出我的约束,所以我稍后可以参考它们)

或者如果您想在新表上执行此操作:

CREATE TABLE tablename (
    [...]
    columnname varchar(255) UNIQUE NULL,
    [...]
)

答案 2 :(得分:0)

我认为您在传递给mysql之前更好地处理数据,或者不是,您可以在更新表时编写触发器触发器,以确保它通过您的规则