避免mySQL表中的重复数据
我的DDBB中有下表:避免mySQL表中的重复数据,mysql,database,Mysql,Database,我的DDBB中有下表: CREATE TABLE subjects ( subject_id int(11) NOT NULL AUTO_INCREMENT, subject text, PRIMARY KEY (subject_id, subject) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1; 这是我的表格的一个示例: id | subject | 1 test 2
CREATE TABLE subjects (
subject_id int(11) NOT NULL AUTO_INCREMENT,
subject text,
PRIMARY KEY (subject_id, subject)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1;
这是我的表格的一个示例:
id | subject |
1 test
2 ICT
3 ICT
密钥id不是重复的,因为它是由MySQL自动生成的,但是两行是重复的
如何避免重复主题名称
我读过这样的“约束”可以实现:
ALTER TABLE subjects
ADD CONSTRAINT constraint_subject UNIQUE KEY(subject);
但我试过了,每次都会出错
我知道以前有人问过这个问题,但我仍然在用PHP输入一些同名的主题,程序总是允许我输入它们。添加约束会给您带来一个错误,因为您已经有了重复的数据,所以无法满足要求 您必须删除重复项,然后添加约束,这样才能工作 如果现在只想选择不同的行,即使数据库中存在重复行,也可以运行以下操作:
SELECT
*
FROM
subjects AS s1
WHERE
NOT EXISTS (
SELECT
id
FROM
subjects AS s2
WHERE
s1.subject = s2.subject
AND s1.id != s2.id
);
或
两者都会给出相同的结果,但我发现第一个结果更明确地说明了您试图实现的目标。您不能在数据类型文本的列上创建索引,因为这对于索引来说太长了 您可以在该列的前缀上创建索引,甚至是唯一索引
ALTER TABLE subjects
ADD CONSTRAINT constraint_subject UNIQUE KEY(subject(191));
这意味着两个主题不能有完全相同的191个前导字符
我认为您不应该声明包含主题的主键。更典型的是单独使用自动递增整数列作为主键
因此,您的表以以下定义结束:
CREATE TABLE `subjects` (
`subject_id` int(11) NOT NULL AUTO_INCREMENT,
`subject` text,
PRIMARY KEY (`subject_id`),
UNIQUE KEY `constraint_subject` (`subject`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
我选择长度191是因为它是InnoDB在索引上的767字节限制所能容纳的最长长度,utf8mb4字符计为4字节。和s1.id!=我想题目是个打字错误。谢谢你的回答!我已经试过你的代码,但它只显示没有重复的主题。好吗?是的,这就是我的问题所在。如果您只需要副本,则将“不存在”更改为“存在”。是的,它可以完美地工作:D,但我如何显示不重复的副本以及仅显示其中一个副本主题?谢谢您的回答!我试过你说的,但是我在Mysql中得到了这个警告:错误代码:1062。键“约束主题”的重复条目。你知道为什么会这样吗?我还从subject中删除了主键,因为您有两行或更多行作为主题,因此建议编辑。换句话说,它们是重复的。当数据包含重复项时,无法创建唯一键约束。若要解决此问题,请为每一行指定一个不同的值,或者将它们设置为NULL,因为UNIQUE KEY忽略NULL。
CREATE TABLE `subjects` (
`subject_id` int(11) NOT NULL AUTO_INCREMENT,
`subject` text,
PRIMARY KEY (`subject_id`),
UNIQUE KEY `constraint_subject` (`subject`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4