外键约束失败,但引用的行存在

lnlaulya  于 2021-06-20  发布在  Mysql
关注(0)|答案(0)|浏览(265)

我在amazonrds上运行mysql 5.7.21。
我知道这个问题已经被问了好几次了,但我得到的是一个我不希望的情况下的问题,所以请阅读通过前向下投票或标记为重复。
我没有恢复数据库,只是运行一个 INSERT 查询,所以不是排序的问题。
表中不存在引用的行;我和我的同事把它检查了三遍。
正如人们所料,禁用fk检查 SET foreign_key_checks = 0 使查询工作正常。
我看到这种情况是由于不同的表字符集造成的,但在本例中,两者都使用 utf8mb4 . 也都将排序规则设置为 utf8mb4_general_ci .
这是在生产环境中发生的,因此我希望避免删除表并重新创建它们。
一些附加信息:
fk约束是在已填充原始表之后创建的。
以下是当前ddl的相关部分:

CREATE TABLE `VehicleTickets` (
  `id` varchar(50) NOT NULL,
  `vehiclePlate` char(7) NOT NULL,
  `organizationId` varchar(50) NOT NULL,
  `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updatedAt` timestamp NULL DEFAULT NULL,
  `status` varchar(15) NOT NULL DEFAULT 'OPEN',
  `description` text NULL DEFAULT NULL,
  `ticketInfo` json DEFAULT NULL,
  `externalId` varchar(100) GENERATED ALWAYS AS (json_unquote(json_extract(`ticketInfo`,'$.externalId'))) VIRTUAL,
  `value` decimal(10,2) GENERATED ALWAYS AS (json_unquote(json_extract(`ticketInfo`,'$.value'))) VIRTUAL,
  `issuedAt` timestamp GENERATED ALWAYS AS (json_unquote(json_extract(`ticketInfo`,'$.issuedAt'))) VIRTUAL NOT NULL,
  `expiresAt` timestamp GENERATED ALWAYS AS (json_unquote(json_extract(`ticketInfo`,'$.expiresAt'))) VIRTUAL NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `VehicleTickets_externalId_unq_idx` (`externalId`,`organizationId`),
  KEY `VehicleTickets_vehiclePlate_idx` (`vehiclePlate`),
  KEY `VehicleTickets_organizationId_idx` (`organizationId`),
  KEY `VehicleTickets_issuedAt_idx` (`createdAt`),
  KEY `VehicleTickets_expiresAt_idx` (`expiresAt`),
  CONSTRAINT `VehicleTickets_Organizations_fk` 
      FOREIGN KEY (`organizationId`) REFERENCES `Organizations` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `Organizations` (
  `id` varchar(50) NOT NULL,
  `name` varchar(100) NOT NULL,
  `taxPayerId` varchar(50) DEFAULT NULL,
  `businessName` varchar(100) DEFAULT NULL,
  `status` varchar(15) NOT NULL DEFAULT 'TESTING',
  `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `activatedAt` timestamp NULL DEFAULT NULL,
  `assetConfiguration` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

当我跑步时:

select * from VehicleTickets where organizationId not in (
    select id from Organizations
);

我得到一个空的结果集。
但是,如果我运行这样的查询:

insert into `VehicleTickets` (
  `id`,
  `createdAt`,
  `organizationId`,
  `ticketInfo`,
  `vehiclePlate`
 )
    values (
      '... application generated id',
      '... current date ',
      'cjlchoksi01r8nfks3f51kht8', -- DOES EXIST on Organizations
      '{ ... some JSON payload }',
      '... vehicle plate'
    )

这将产生以下错误:
无法添加或更新子行:外键约束失败( VehicleTickets ,约束 VehicleTickets_Organizations_fk 外键( organizationId )参考文献 Organizations ( id ))
此外,它给了我:

"errno": 1452,
"sqlState": "23000",

关于这个问题,我读了好几篇文章,但没有找到类似的案例。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题