mysql - 使用 UNIQUE 索引好吗?

标签 mysql database database-design

我有一个学生名册,主表是这个,我只是想确保不会有重复姓名、电子邮件等的学生。ID 是主键,所以我不需要使用PK.

CREATE TABLE student(
id INT UNSIGNED NOT NULL,
campus_id SMALLINT UNSIGNED NOT NULL,
first_career_id SMALLINT UNSIGNED NOT NULL,
second_career_id SMALLINT UNSIGNED NULL,
name VARCHAR(70) NOT NULL,
password CHAR(60) NOT NULL,
email VARCHAR(100) NOT NULL,
phone TINYINT UNSIGNED NULL,
UNIQUE(id),
UNIQUE(name),
UNIQUE(email),
UNIQUE(phone),
FOREIGN KEY(first_career_id)
    REFERENCES career(id)
    ON DELETE CASCADE,
FOREIGN KEY(second_career_id)
    REFERENCES career(id)
    ON DELETE CASCADE
) ENGINE=INNODB;

我可以在通过应用程序插入这些字段时验证它们,哪种方式更好?

最佳答案

如果唯一性是域约束(在您的示例中),则在列上创建 UNIQUE 约束(为您创建唯一索引)。

ALTER TABLE student 
ADD CONSTRAINT ux_student_email
UNIQUE (email)

如果您可以 100% 确定(和 future 证明)没有其他应用程序会插入数据,那么确保应用程序的唯一性就很好。如果您重视正确性,除了检查应用程序之外,还要在数据库级别添加约束。

关于mysql - 使用 UNIQUE 索引好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49951886/

相关文章:

.net - 更改数据后自动对 Access 表中的记录重新编号

mysql - 在自引用表中显示同一列两次

php - 在 PHP 中为空数据库查询生成错误消息

php - 更好的日志记录设计或一些 SQL 魔法?

ruby-on-rails - 在设计 Rails 数据库模式时如何避免使用关注点?

performance - 为了性能而允许数据库中存在冗余数据

mysql 将同一行上的 2 个时间戳列与搜索范围进行比较

mysql - 获取同一表/列上不同购买类型的计数和总和

mysql - 处理版本

java - 如何自定义jdbcTemplate.queryForMap()返回的map中值的类型?