【问题标题】:Integrity constraint violation error完整性约束违反错误
【发布时间】:2015-06-10 09:03:11
【问题描述】:

我收到以下错误:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in field list is ambiguous

我不知道它是从哪里来的。堆栈跟踪也不清楚。引发此错误的查询:

Database::executeQuery('CREATE TEMPORARY TABLE tmp_inventory ENGINE=MEMORY '
                . 'SELECT id, email_hash, mailing_list_id, ttl, price, last_click, last_view, extra_data '
                . 'FROM inventory i INNER JOIN mailing_list ml on i.mailing_list_id = ml.id '
                . 'WHERE i.active = 0 AND i.deleted = 1 AND i.completely_deleted = 1 AND i.resting_to < NOW() AND i.next_sync_at < NOW() AND ml.active = 0 '
                . 'LIMIT 10;');

所以我有两个表 - inventory 和 mailing_list。库存具有以下结构:

CREATE TABLE `inventory` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `email_hash` char(32) NOT NULL,
  `mailing_list_id` int(6) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `last_send_at` datetime DEFAULT NULL,
  `resting_to` datetime DEFAULT NULL,
  `next_sync_at` datetime DEFAULT NULL,
  `ttl` datetime DEFAULT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `deleted` tinyint(1) NOT NULL DEFAULT '0',
  `completely_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `price` int(10) unsigned NOT NULL,
  `last_view` datetime DEFAULT NULL,
  `last_view_at` datetime DEFAULT NULL,
  `last_updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
)

还有邮件列表:

CREATE TABLE `mailing_list` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '0',
  `created_at` datetime NOT NULL,
  `price` int(10) unsigned NOT NULL DEFAULT '1000',
  `ttl` int(10) unsigned NOT NULL DEFAULT '604800',
  `resting_time` int(10) unsigned NOT NULL DEFAULT '0',
  `email_from` varchar(255) DEFAULT NULL,
  `email_return_path` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

怎么了?

【问题讨论】:

  • 查询不知道 id 字段是来自表 mailing_list 还是inventory。你应该使用 i.id 或 ml.id
  • @Unex 您应该将其发布为答案,以便 khernik 可以验证它:) 这一切都是关于使用正确的表名或别名为查询字段添加前缀
  • 是的,我知道,但是从中赢得积分感觉太容易了:D
  • 我无法更改查询:D 如果有的话,我只能更改数据库结构。
  • 您不能更改查询?你到底在做什么?您可以更改您不想要的 id 字段的名称。但 srsly 这是一个非常糟糕的解决方案!

标签: php mysql


【解决方案1】:

在您的查询中,您正在访问 2 个表:FROM 子句中的 inventory,INNER JOIN 子句中的 mailing_list。 这两个表都有一个名为id 的列,因此您的数据库不知道您指的是哪一列。

要解决此问题,请在您的选择中指定表格,将id 替换为i.id 或ml.id

【讨论】:

  • 我无法更改查询,只能更改表结构。
  • mailing_list.id 列在 INNER JOIN 子句中被引用,因此您无法更改该列名。您可以将inventory.id 更改为inventory._id,但是您必须更改SELECT 子句
猜你喜欢
  • 2020-06-14
  • 2012-12-26
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 2021-12-13
  • 2017-10-01
  • 2019-04-12
相关资源
最近更新 更多