我有一个包含3列的表——id(pk)、pageId(fk)、name.我有一个php脚本,它将大约5000条记录转储到表中,其中大约一半是重复的,具有相同的pageId和名称.pageId和name的组合应该是唯一的.在php中循环脚本时,防止重复项保存到表中的最佳方法是什么?

推荐答案

第一步是在表上设置一个唯一的键:

ALTER TABLE thetable ADD UNIQUE INDEX(pageid, name);

然后你必须决定当有复制品时你想做什么.你应该:

  1. 忽略它?

    INSERT IGNORE INTO thetable (pageid, name) VALUES (1, "foo"), (1, "foo");
    
  2. 是否覆盖以前输入的记录?

    INSERT INTO thetable (pageid, name, somefield)
    VALUES (1, "foo", "first")
    ON DUPLICATE KEY UPDATE (somefield = 'first')
    
    INSERT INTO thetable (pageid, name, somefield)
    VALUES (1, "foo", "second")
    ON DUPLICATE KEY UPDATE (somefield = 'second')
    
  3. 更新一些计数器?

    INSERT INTO thetable (pageid, name)
    VALUES (1, "foo"), (1, "foo")
    ON DUPLICATE KEY UPDATE (pagecount = pagecount + 1)
    

Mysql相关问答推荐

如果WHERE语句包含所有列,唯一键顺序是否重要?

为分组记录MySQL取取值为TRUE的单行

MySQL RDS ALTER TABLE ENUM短暂中断了我的数据库连接

使用触发器markdown 10%

如何从MySQL数据库中提取入职第一个月的工作天数?

使用字符串文字与使用日期文字时的SQL行为

带有值分隔的MySQL分组不起作用

Ballerina SQL 中是否也应该考虑输入清理?

使用 SELECT 时应锁定多少行 .. FOR UPDATE LIMIT 1

根据 JOIN 结果计算列中的值?

将 AVG 与 HAVING 结合使用

处理 Visits 表中数百万行的最佳方法是什么?

添加一个日期字段大于另一个日期字段的要求

重新加载 .env 变量而不重新启动服务器(Laravel 5,共享主机)

MAMP mysql 服务器无法启动.没有mysql进程正在运行

如何使用 XML_LOAD() 将 XML 文件导入 MySQL 数据库表;功能

加快 mysql 转储和导入

什么是全文索引,我应该什么时候使用它?

Yii2 如何进行 where AND 或 OR 条件分组?

表被指定了两次,既作为更新的目标,又作为 mysql 中数据的单独源