【发布时间】:2015-07-20 11:07:23
【问题描述】:
每天我在 mysql 中添加近 5000 条新记录,我想防止在表中插入重复行,我想我应该在任何插入操作之前检查所有银行,是否合适? 或者有什么更好的办法吗?? 提前谢谢
【问题讨论】:
-
是的,在 MySQL 中创建一组列
UNIQUE -
没错,但我不会花掉所有的源 RAM CPU ...,是吗????
每天我在 mysql 中添加近 5000 条新记录,我想防止在表中插入重复行,我想我应该在任何插入操作之前检查所有银行,是否合适? 或者有什么更好的办法吗?? 提前谢谢
【问题讨论】:
UNIQUE
通过对不可重复的字段属性应用唯一索引来防止数据模型被软件破坏是一个不错的选择。
最好在插入数据之前向数据库询问重复的候选人。
最好的办法是将两者结合起来。数据库模型的安全性和软件层中的重复问题,因为 a) 错误处理比查询更昂贵,b) 约束保护数据免受人为故障的影响。
mysql 使用 CREATE UNIQUE INDEX 语句支持唯一索引。
例如:在 BAR(X,Y,Z) 上创建唯一索引 IDX_FOO;
在表 BAR 上创建唯一索引。运行重复查询时也将使用此索引 - 大大加快了处理速度。
更多详情请见MySQL Documentation。
【讨论】:
当您遇到数据完整性问题时,您希望数据库强制执行规则(如果可能)。在您的情况下,您可以使用唯一索引或唯一约束来执行此操作,它们是同一事物的两个名称。这是示例语法:
create unique index idx_table_col1_col2 on table(col1, col2)
您希望在数据库中执行此操作,原因有三个:
然后,MySQL 具有非常有用的结构来处理重复项,特别是 insert . . . on duplicate key update、insert ignore 和 replace。
当您从应用程序运行 SQL 查询时,无论如何您都应该检查错误,因此捕获重复键错误应该不会对应用程序造成额外负担。
【讨论】:
首先,任何需要唯一的列都可以使用UNIQUE 约束:
CREATE TABLE IF NOT EXISTS tableName
(id SERIAL, someUniqueColumnName VARCHAR(255) NOT NULL UNIQUE);
请参阅 MySQL 文档for adding uniqueness to existing columns。
您需要确定表中的重复项是什么,因为唯一性并不总是仅限于单个列。例如,在一个表中,您存储具有相应 id 的用户以用于其他东西,那么它可能会被组合在一起,它们必须是唯一的。为此,您可以拥有PRIMARY KEY,它使用两列:
CREATE TABLE IF NOT EXISTS tableName (
id BIGINT(20) UNSIGNED NOT NULL,
pictureId BIGINT(20) UNSIGNED NOT NULL,
someOtherColumn VARCHAR(12),
PRIMARY KEY(id, pictureId));
【讨论】: