我在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",
关于这个问题,我读了好几篇文章,但没有找到类似的案例。
暂无答案!
目前还没有任何答案,快来回答吧!