mysql - 修改表: only allow either unique or empty

标签 mysql

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

我该怎么做?

最佳答案

MySQL 包含一个约束类型 UNIQUE 来实现这一点。如果您声明一个列 UNIQUE 并允许其中包含 NULL 值,则所有值都将被强制为唯一,除非它们是 NULL 值。如果你想防止存储空字符串 (''),你必须在代码级别进行管理,因为 MySQL 会将其视为另一个字符串并允许在 中存储一次。 >唯一列。如果没有值传递给此类列,它将自动默认为 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,
    [...]
)

关于mysql - 修改表: only allow either unique or empty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18636133/

相关文章:

java - 如何在mysql for java中创建存储过程?

php - 在 Yii 中使用不带 activeRecord 的 mysql IN 子句时如何防止 mysql 注入(inject)?

mysql - 3 表 JOIN 与 group by 不起作用

MySQL 基于日期范围加入

php - UNIX_TIMESTAMP(时间戳) 使用

php 复杂关联数组与 $_POST 匹配

mysql - 定期备份 MySQL 数据库

php - mysql_fetch 不显示

mysql - 使用从一个表到另一个表的 COUNT(*) 值

mysql - 如何在android中将Mysql DB导入到SQlite中?