外键问题

时间:2013-03-05 12:11:25

标签: mysql sql foreign-keys

我正在构建一个调查应用程序,它包含3个复选框和一个问题,当点击butten它提交答案但最近我在我的表中添加了一个外键,当我尝试提交答案时我收到此错误:

A Database Error Occurred

Error Number: 1452

Cannot add or update a child row: a foreign key constraint fails (`user_test`.`tblanswers`, CONSTRAINT `tblanswers_ibfk_1` FOREIGN KEY (`answerid`) REFERENCES `credentials` (`cid`) ON UPDATE CASCADE)

INSERT INTO `tblanswers` (`questionid`, `answerA`, `answerB`, `answerC`, `comment`, `cid`) VALUES ('melynas ', 'melynas ', 'baltas', 'geltonas', 'testas', NULL)

Filename: C:\wamp\www\Surva\system\database\DB_driver.php

Line Number: 330

任何人都可以帮助我解释我做错了吗? tnx提前。

表格结构

我忘了提到我正在使用codeigniter。

凭据表

IF NOT EXISTS `credentials` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `second_name` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=98 ;

--
-- Constraints for dumped tables
--

--
-- Constraints for table `credentials`
--
ALTER TABLE `credentials`
  ADD CONSTRAINT `credentials_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `tblanswers` (`answerid`) ON UPDATE CASCADE;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION 

tblanswers

CREATE TABLE IF NOT EXISTS `tblanswers` (
  `answerid` int(11) NOT NULL AUTO_INCREMENT,
  `userid` int(11) DEFAULT NULL,
  `cid` int(11) DEFAULT NULL,
  `questionid` int(11) NOT NULL,
  `answerA` varchar(255) NOT NULL,
  `answerB` varchar(255) NOT NULL,
  `answerC` varchar(255) NOT NULL,
  `comment` varchar(255) NOT NULL,
  PRIMARY KEY (`answerid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=205 ;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

2 个答案:

答案 0 :(得分:1)

这只是意味着您在子表上插入一个父表上不存在的值。请考虑以下架构。

Table1
- ID (PK)
- Name

Table2
- RecID (PK)
- OtherColumn
- Table1ID (FK)

Table2Table1IDTable1ID列的子表。

Table1 
ID      Name
1       John
2       Hello

Table2
RecID   OtherColumn     Table1ID
1       asd             1
2       qwe             2
3       rty             1

正如您所看到的Table2Table1ID的值都显示在Table1ID上,因为它取决于Table1

当您尝试INSERT Table2Table1ID Table1的值INSERT INTO Table2 (RecID, OtherColumn, Table1ID) VALUES (1, 'xxx', 10) 时,它会生成错误,因为外键会强制执行参照完整性。

预计会失败的查询示例。

10

原因是因为Table1ID Table1 ID上没有列{{1}}的值{{1}}。

答案 1 :(得分:0)

如果将外键放在当前表中,则无法在不在主列中的外来列中插入记录。

就像你有桌子一样

Tbl1主键:id

      id    username    password
      1     test1       123456
      2     test2       123

你的第二张桌子

Tbl2外键:t1_id

      ti_id    fname      address
      1        temp       strret
      3        tesp3      strrr

您无法插入第二条记录,因为Tbl1中没有列具有id = 3

你的案例中的这类问题