SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败

8wigbo56  于 2022-09-18  发布在  Java
关注(0)|答案(10)|浏览(379)

我正在尝试将值插入到我的注解表中,但遇到错误。它说我不能添加或更新子行,我不知道这是什么意思。我的架构如下所示:

--
-- Baza danych: `koxu1996_test`
--

-- --------------------------------------------------------

--
-- Struktura tabeli dla tabeli `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) COLLATE utf8_bin NOT NULL,
  `password` varchar(64) COLLATE utf8_bin NOT NULL,
  `password_real` char(32) COLLATE utf8_bin NOT NULL,
  `email` varchar(32) COLLATE utf8_bin NOT NULL,
  `code` char(8) COLLATE utf8_bin NOT NULL,
  `activated` enum('0','1') COLLATE utf8_bin NOT NULL DEFAULT '0',
  `activation_key` char(32) COLLATE utf8_bin NOT NULL,
  `reset_key` varchar(32) COLLATE utf8_bin NOT NULL,
  `name` varchar(32) COLLATE utf8_bin NOT NULL,
  `street` varchar(32) COLLATE utf8_bin NOT NULL,
  `house_number` varchar(32) COLLATE utf8_bin NOT NULL,
  `apartment_number` varchar(32) COLLATE utf8_bin NOT NULL,
  `city` varchar(32) COLLATE utf8_bin NOT NULL,
  `zip_code` varchar(32) COLLATE utf8_bin NOT NULL,
  `phone_number` varchar(16) COLLATE utf8_bin NOT NULL,
  `country` int(8) NOT NULL,
  `province` int(8) NOT NULL,
  `pesel` varchar(32) COLLATE utf8_bin NOT NULL,
  `register_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `authorised_time` datetime NOT NULL,
  `edit_time` datetime NOT NULL,
  `saldo` decimal(9,2) NOT NULL,
  `referer_id` int(8) NOT NULL,
  `level` int(8) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `country` (`country`),
  KEY `province` (`province`),
  KEY `referer_id` (`referer_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=83 ;

我正在尝试执行的MySQL语句如下所示:

INSERT INTO `user` (`password`, `code`, `activation_key`, `reset_key`, `register_time`,                `edit_time`, `saldo`, `referer_id`, `level`) VALUES (:yp0, :yp1, :yp2, :yp3, NOW(), NOW(), :yp4, :yp5, :yp6). Bound with :yp0='fa1269ea0d8c8723b5734305e48f7d46', :yp1='F154', :yp2='adc53c85bb2982e4b719470d3c247973', :yp3='', :yp4='0', :yp5=0, :yp6=1

我收到的错误如下所示:

SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败(koxu1996_test.user,约束user_ibfk_1外键(country)引用country_type(id)on DELETE NO ACTION ON UPDATE NO ACTION)

bksxznpy

bksxznpy1#

这仅仅意味着您正在插入的表COMMENTS上的COUNTRY列的值在表COUNTRY_TYPE上不存在,或者您没有在表USER上插入COUNTRY的值。请记住,表COMMENTS上的COUNTRY列的值取决于表COUNTRY_TYPE上的ID的值。

ryoqjall

ryoqjall2#

这个表和另一个表之间有外键,而新行将违反该约束。

如果运行show create table user,您应该能够看到约束,它显示为CONSTRAINT...,并显示哪些列引用了哪些表/列。

在本例中,country引用country_type (id),而您没有指定country的值。您需要放置country_type中存在的值。

rqqzpn5f

rqqzpn5f3#

我只是提出我自己的问题,以防它可以帮助其他人,我复制/粘贴我的迁移文件中的条目,并通过在整数周围加引号来搞砸。由于我试图输入的值被认为是要进入引用另一个整数的整型字段的字符串,因此出现了这个错误。

00jrzges

00jrzges4#

另一种选择可能是源表中的主键不是无符号的,所以我用(注意id int(8)无符号)解决了相同的INSERT:
CREATE TABLE IF NOT EXISTS e1d1e(id int(8)unsign NOT NULL AUTO_INCREMENT,username varchar(32)COLLATE UTF8_BIN NOT NULL,
password varchar(64)排序UTF8_bin非空,password_real char(32)排序UTF8_bin非空,email varchar(32)排序UTF8_bin非空,code char(8)排序UTF8_bin非空,
activated枚举(‘0’,‘1’)排序UTF8_bin非空默认为‘0’,
activation_key char(32)排序UTF8_bin非空,reset_key varchar(32)排序UTF8_bin非空,name varchar(32)排序UTF8_bin非空,street varchar(32)排序UTF8_bin非空,
house_number varchar(32)排序UTF8_bin非空,
apartment_number varchar(32)COLLE UTF8_bin NOT NULL、city varchar(32)COLLE UTF8_bin NOT NULL、zip_code varchar(32)COLLE UTF8_bin NOT NULL、phone_number varchar(16)COLLE UTF8_BIN NOT NULL、country int(8)NOT NULL、province INT(8)NOT NULL、pesel varchar(32)COLLATE UTF8_BIN NOT NULL
register_time时间戳不为空默认Current_Timestamp,
authorised_time日期时间不为空,edit_time日期时间不为空,saldo十进制(9,2)不为空,referer_id int(8)不为空,
level int(8)NOT NULL,主键(id),键country(country),键province(province),键referer_id(referer_id))引擎=InnoDB默认字符集=UTF8 COLLATE=UTF8_BIN AUTO_INCREMENT=83;

wvt8vs2t

wvt8vs2t5#

在我的例子中,目标表列的值为空,而引用表列的值为空。因此抛出了这个错误。

ifmq2ha2

ifmq2ha26#

在我的例子中,相关表上的引用值不对应。只需确保引用表上的值存在,并且Current行具有相应的有效值。

mznpcxlj

mznpcxlj7#

在我的例子中,在SQL命令中没有问题,但输入没有作为**$REQUEST**发送,所以在php.ini文件中:

MAX_INPUT_VARS默认设置为1000,我将其更改为:

max_input_vars = 2000

然后,您必须重新启动Web服务器。

uujelgoq

uujelgoq8#

对于空值,您应该传递NULL。非空字符串,如''

bprjcwpo

bprjcwpo9#

in my case this was the error: Illuminate\Database\QueryException SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'brand_name_ur' cannot be null (SQL: insert into brands (brand_name_en, brand_name_ur, brand_slug_en, brand_slug_ur, brand_image) values (SAMI, ?, sami, سامی, upload/brand/1742772943246486.png))

and fixed by

'brand_name_ur' => $request -> brand_image_ur, < changing brand_image_ur to brand_name_ur. Noob mistak. took my hour.

laawzig2

laawzig210#

thanks to @Tsimtsum
By running a request like :

SELECT user.id as user_id, country as user_country_type_id, country_type.id as country_type_id
FROM `user`
LEFT JOIN country_type ON country_type.id = user.country
WHERE country_type.id is null;

it probably returns some rows and it should not !

相关问题