【发布时间】:2010-12-27 12:56:42
【问题描述】:
我有两个 mysql 表:TableA 有 10,000 条记录 TableB 有 2,000 条记录。
我想将 TableA 中的 8,000 条唯一记录复制到 TableB 中,忽略 TableB 中已复制的 2,000 条记录。
【问题讨论】:
-
关于您的 PHP 数组比较,请将其发布在一个新的单独问题中。这无关紧要,您可以提出的问题数量没有限制。
我有两个 mysql 表:TableA 有 10,000 条记录 TableB 有 2,000 条记录。
我想将 TableA 中的 8,000 条唯一记录复制到 TableB 中,忽略 TableB 中已复制的 2,000 条记录。
【问题讨论】:
如果唯一性由PRIMARY KEY 约束或UNIQUE 约束确定,则可以使用INSERT IGNORE:
INSERT IGNORE INTO TableB SELECT * FROM TableA;
重复的行和与 TableB 中已有行冲突的行将被静默跳过,并应插入其他 8,000 行。
有关详细信息,请参阅INSERT 上的文档。
如果您需要在 PHP 中执行此操作,请阅读 array_diff_key() 函数。将具有主键值的数组存储为数组元素的键。但是,无法保证此 PHP 函数在如此大的数组上的性能!
【讨论】:
使用INSERT INTO 语法:
INSERT INTO TABLE_B
SELECT *
FROM TABLE_A a
WHERE NOT EXISTS(SELECT NULL
FROM TABLE_B b
WHERE b.column = a.column)
您需要更新WHERE b.column = a.column) 以满足但您确定TABLE_B 中已存在一条记录。
【讨论】:
这样的事情怎么样:
insert into TableB
select *
from Table A
where not exists (
select 1
from TableB
where TableB.id = TableA.id
)
或者,如果表 B 中的条目因为它们的主键而“不唯一”,我想insert ignore 可能会解决问题。
【讨论】: