【问题标题】:mysql add constraint - #1005 - Can't create table ... errno: 121 Duplicate key on write or updatemysql add constraint - #1005 - Can't create table ... errno: 121 Duplicate key on write or update
【发布时间】:2021-03-08 19:13:02
【问题描述】:

我一直在拉我的头发,我确信这是我看不到的小东西......

这是我的 2 个表公司和具有多对多关系的人员以及我的数据透视表 company_people:

CREATE TABLE `companies` (
  `id` bigint UNSIGNED NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `is_active` int NOT NULL DEFAULT '1',
  `company` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `peoples` (
  `id` bigint UNSIGNED NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `is_active` int NOT NULL DEFAULT '1',
  `firstname` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `lastname` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '',
  `company_id` bigint UNSIGNED DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci PACK_KEYS=0;

CREATE TABLE `company_people` (
  `id` bigint NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `company_id` bigint UNSIGNED NOT NULL,
  `people_id` bigint UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `companies`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `peoples`
  ADD PRIMARY KEY (`id`),
  ADD KEY `company_id` (`company_id`);

ALTER TABLE `company_people`
  ADD PRIMARY KEY (`id`),
  ADD KEY `company_id` (`company_id`),
  ADD KEY `people_id` (`people_id`);

ALTER TABLE `companies`
  MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT;

ALTER TABLE `peoples`
  MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT;

ALTER TABLE `company_people`
  MODIFY `id` bigint NOT NULL AUTO_INCREMENT;

ALTER TABLE `peoples`
  ADD CONSTRAINT `peoples-company` FOREIGN KEY (`company_id`) REFERENCES `companies` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `company_people`
  ADD CONSTRAINT `companies-peoples` FOREIGN KEY (`company_id`) REFERENCES `companies` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `company_people`
  ADD CONSTRAINT `peoples-companies` FOREIGN KEY (`people_id`) REFERENCES `peoples` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

除了最后一个给出以下错误的 mysql 语句外,一切正常:#1005 - 无法创建表 FairTrade.company_people (errno: 121 "Duplicate key on write or update")

故障在哪里?

【问题讨论】:

    标签: mysql foreign-keys constraints


    【解决方案1】:

    你有一个错误

    ALTER TABLE `companies`
      ADD PRIMARY KEY (`id`),
      ADD KEY `company_id` (`company_id`);
    

    明白了

    错误代码:1072。表中不存在键列“company_id”

    所以删除像这样的键

    ALTER TABLE `companies`
      ADD PRIMARY KEY (`id`)
      ;
    

    或选择另一列

    【讨论】:

    • 我同意如果您运行此代码会出现错误,但这是因为我错误地删除了表公司中的 company_id 定义。再次运行代码,您将看到另一个错误。
    • 我在我的 mysql 8.0.23 中运行 rhis 代码,它运行没有问题,所以你运行的是哪个版本的 mysql。
    • 谢谢@nbk。如果我在空数据库上运行代码,则没有错误,但如果我尝试在具有干净数据的现有表上运行外键约束,我会收到错误...
    • 看我不能跟着你看这里dbfiddle.uk/… 改变它,这样它就会出错
    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 2021-08-31
    • 2021-04-24
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多