我正在尝试将值插入到我的评论表中,但是我收到了错误消息。它说我无法添加或更新子行,我不知道这意味着什么。 我的架构看起来像这样:
--
-- 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
,CONSTRAINTuser_ibfk_1
FOREIGN KEY (country
)引用country_type
(id
)ON DELETE NO ACTION ON 更新无行动)
答案 0 :(得分:21)
它只是意味着您要插入的表格注释中的列国家/地区的值在 country_type 表格中不存在,或者您没有在表格用户。 请记住,表格注释中列国家/地区的值取决于表格 country_type 上的ID值。
答案 1 :(得分:5)
此表与另一个表之间有外键,新行将违反该约束。
如果您运行show create table user
,您应该能够看到约束,它显示为CONSTRAINT...
,并显示哪些列引用了哪些表/列。
在这种情况下,country
引用country_type (id)
并且您没有指定country
的值。您需要设置country_type
中存在的值。
答案 2 :(得分:1)
只是抛出我自己的问题,以防它可以帮助别人,我在我的迁移文件中复制/粘贴条目,并通过在整数周围加上引号搞砸了。由于我试图输入的值被认为是一个字符串进入一个引用另一个整数的整数字段,因此出现了这个错误。
答案 3 :(得分:1)
对于我来说,在 SQL 命令中没有问题,但是输入不是作为 $ request 发送的,因此在php.ini文件中:
max_input_vars默认为1000,我将其更改为:
max_input_vars = 2000
然后您必须重新启动Web服务器。
答案 4 :(得分:0)
另一个选项可能是你的源表中的主键不是无符号的,所以我解决了相同的插入(注意id
int(8)unsigned):
CREATE TABLE IF NOT EXISTS
user
(id
int(8)unsigned 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,code
char(8)COLLATE utf8_bin NOT NULL,
activated
枚举(' 0',' 1')收集utf8_bin NOT NULL默认' 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
时间戳NOT NULL DEFAULT CURRENT_TIMESTAMP,
authorised_time
datetime NOT NULL,edit_time
datetime NOT NULL,saldo
十进制(9,2)NOT NULL,referer_id
int(8)NOT NULL,
level
int(8)NOT NULL,PRIMARY KEY(id
),KEYcountry
(country
),键province
(province
),键referer_id
(referer_id
))ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin AUTO_INCREMENT = 83;
答案 5 :(得分:0)
就我而言,目标表列的值为空,而引用表列具有该值。因此抛出了这个错误。
答案 6 :(得分:0)
在我的情况下,引用值在相关表上不对应。只需确保参考表上存在值,并且当前行具有相应的有效值。