【发布时间】:2013-09-05 02:32:28
【问题描述】:
我有一个简单的表,有两列,每一列都是一个键值。每个字段中存储的值是 varchar(45),表示电子邮件地址和关键字。收集的信息可能会重复,因为它与网站浏览数据收集有关。为了避免重复条目,我曾经尝试使用 INSERT IGNORE into,REPLACE into,最后我尝试了以下操作:
insert into <table name> (user_email, key_token) values ('<email>@<this>.com', 'discountsupplies') on duplicate key update user_email='<email>@<this>.com',key_token='discountsupplies';
但我仍然看到重复的记录被插入到表中。 生成表的 SQL:
DROP TABLE IF EXISTS `<database name>`.`<table name>` ;
CREATE TABLE IF NOT EXISTS `<database name>`.`<table name>` (
`user_email` VARCHAR(45) NOT NULL ,
`key_token` VARCHAR(45) NOT NULL,
PRIMARY KEY (`user_email`, `key_token`) )
ENGINE = InnoDB;
虽然我看到了几个与此问题相近的问题,但我没有看到任何解决为什么会发生这种情况的问题,我想弄清楚我对这种行为的不理解。任何帮助表示赞赏。
作为附录,在添加 UNIQUE KEY 语句后,我返回并尝试了 REPLACE 和 INSERT IGNORE 来实现我的目标,这些选项都没有排除重复条目。
另外添加:UNIQUE INDEX (user_email, key_token)
似乎也没有帮助。
我将通过手动查找例程来执行此检查,直到我弄明白为止。如果我找到答案,我会很乐意更新帖子。
在原始创建表语句下方添加了唯一索引行 -
-- -----------------------------------------------------
-- Table `<db name>`.`<table name>`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `<db name>`.`<table name>` ;
CREATE TABLE IF NOT EXISTS `<db name>`.`<table name>` (
`user_email` VARCHAR(45) NOT NULL ,
`key_token` VARCHAR(45) NOT NULL,
PRIMARY KEY (`user_email`, `key_token`),
UNIQUE KEY (user_email),
UNIQUE KEY (key_token)
)
ENGINE = InnoDB;
CREATE UNIQUE INDEX ix_<table name>_useremail on `<db name>`.`<table name>`(user_email);
CREATE UNIQUE INDEX ix_<table name>_keytoken on `<db name>`.`<table name>`(key_token);
似乎没问题(在源步骤中创建表时没有错误),但是在运行重复查询时我仍然得到重复。
【问题讨论】:
-
重复是什么意思?您是否在一列中有两封相同的电子邮件(在该列中定义了
UNIQUE)? -
你能发布一些你认为重复的数据吗?
-
这是表中第一个出现的 sn-p '剪切和粘贴'(出于隐私考虑,电子邮件已从原始地址修改),证明了重复。即使第一条记录清楚地在表中,第三条记录也会被添加。 melanies@gmail.com tempurpedic-beds melanies@gmail.com child-safety-gates melanies@gmail.com tempurpedic-beds
-
你需要创建两个 分开
UNIQUE KEYs:CREATE UNIQUE INDEX ix_mytable_useremail ON mytable (user_email),CREATE UNIQUE INDEX ix_mytable_keytoken ON mytable (key_token)
标签: mysql duplicates