【发布时间】:2020-05-16 19:04:35
【问题描述】:
我有一个comment 表和一个comment_edit 表,还有olddb_edit。简化后,相关表格如下所示:
CREATE TABLE `olddb_edit` (
edit_id INT NOT NULL,
edit_time INT NOT NULL,
edit_text TEXT NOT NULL,
PRIMARY KEY (edit_id, edit_time)
) ENGINE=InnoDB;
现在我想将内容从另一个数据库迁移到编辑表中,但跳过一些表行,如 test-cmets。我正在为此使用 CakePHP(实际上是 Phinx)。
通常,这就足够了:
$skippable = array(
12345, 23456, 34567, 45678,
);
$rows = $this->getQueryBuilder()
->select('*')
->from('olddb_comment')
->where(array(
'comment_id NOT IN' => $skippable,
))
->execute()
->fetchAll('assoc')
;
但一个简单的NOT IN 子句显然不适用于复合主键。
我在想,$skippable 数组应该是这样的:
$skippable = array(
array('id' => 707969, 'time' => 1434462225),
array('id' => 707969, 'time' => 1434462463),
array('id' => 707969, 'time' => 1434462551),
);
然后我将通过 for 循环或其他方式运行 where 子句。但老实说,我什至不知道如何在 vanilla-MySQL 中做到这一点。
可能已经在 SO 上发布了解决方案,但我找不到任何解决方案(除了特定于其他应用程序的解决方案)。我猜这个算法不是我的朋友。
【问题讨论】:
-
请询问 1 个经过研究且不重复的具体问题,了解您遇到的问题。对于代码问题,请给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。对于 SQL、DBMS 和 DDL(包括约束和索引)和输入格式为表格的代码。查询不需要 PS Keys。连接是基于条件的,而不是键。子查询的 IN 需要一行,而不是一个键。是否是多列是特定于 DBMS 的。通常 EXISTS 是更好的选择。
标签: mysql cakephp composite-primary-key notin phinx