Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免mySQL表中的重复数据_Mysql_Database - Fatal编程技术网

避免mySQL表中的重复数据

避免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

我的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       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