2

我有一个现有的 mysql 表,我想设置一个字段(varchar),以便它必须是唯一的,或者是空的(默认情况下)。所以当用户不输入值时,它是空的,否则用户必须输入唯一的值。

我该怎么做?

4

3 回答 3

2

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,
    [...]
)
于 2013-09-05T12:28:38.930 回答
1

从我读过的内容来看,按照标准,表中应该不可能有一个允许空值并且具有唯一约束的列;如果是,则归结为一个特殊的mysql引擎(这将导致其他地方的不可预测/意外的行为,恕我直言)

你的问题也似乎与这个问题相反

MySQL:唯一,但默认为 NULL - 通过创建表允许。允许插入超过 1 个 NULL。为什么?

但是,您可以使用触发器强制执行此操作,您可以在插入/更新时编写触发器以检查该值是否已经存在,如果存在则立即将其删除。

于 2013-09-05T12:23:47.440 回答
0

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

于 2013-09-05T12:24:10.003 回答