SQL一对多用户外键问题

时间:2015-10-13 16:24:28

标签: mysql sql

  

错误:无法添加或更新子行:外键约束   失败?       (testloginleavetable,约束leavetable_ibfk_1外国钥匙
      (users_id)引用usersid)ON更新CASCADE上的DELCAD CASCADE)

在最后一天半收到此消息。试图在两个表之间建立一对多(外键)关系。在users:idleavetable:users_id之间。当用户登录时,他们会获得一个id。当他们向专栏hours提交表单时,我希望id能够保留表单数据。当有人创建新的ID号并且它不会更新leavetable:user_id时,它会抛出错误。它抛出上面的错误。

发生了什么事?我是以正确的方式接近这个吗?

这是我的代码:

CREATE TABLE IF NOT EXISTS `users` ( 
`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`id` int(11) NOT NULL, 
`password` char(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`salt` char(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 



CREATE TABLE IF NOT EXISTS `leavetable` ( 
`hours` int(11) NOT NULL, 
`users_id` int(11) DEFAULT NOT NULL, 
`id` int(11) NOT NULL 
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


 ALTER TABLE `users` 
 ADD PRIMARY KEY (`id`) USING BTREE, 
 ADD UNIQUE KEY `email` (`email`) USING BTREE, 
 ADD UNIQUE KEY `username` (`username`) USING BTREE; 

 ALTER TABLE `leavetable` 
 ADD PRIMARY KEY (`id`) USING BTREE, 
 ADD KEY `users_id` (`users_id`) USING BTREE; 

 ALTER TABLE `leavetable` 
 MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 
 -- AUTO_INCREMENT for table `users` 
 ALTER TABLE `users` 
 MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 

ALTER TABLE `leavetable` 
ADD CONSTRAINT `leavetable_ibfk_1` FOREIGN KEY (`users_id`) REFERENCES
`users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

我的表结构:

+---------------------+
| Tables_in_testlogin |
+---------------------+
| leavetable          |
| users               |
+---------------------+

+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| email    | varchar(255) | NO   | UNI | NULL    |                |
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| password | char(64)     | NO   |     | NULL    |                |
| salt     | char(16)     | NO   |     | NULL    |                |
| username | varchar(255) | NO   | UNI | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

+----------+---------+------+-----+---------+----------------+
| Field    | Type    | Null | Key | Default | Extra          |
+----------+---------+------+-----+---------+----------------+
| hours    | int(11) | NO   |     | NULL    |                |
| users_id | int(11) | NO   | MUL | NULL    |                |
| id       | int(11) | NO   | PRI | NULL    | auto_increment |
+----------+---------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

php代码:

  mysql_select_db("testlogin", $con);
$sql="INSERT INTO leavetable (hours)
VALUES
('$_POST[hours]')";
if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }

2 个答案:

答案 0 :(得分:0)

$sql="INSERT INTO leavetable (hours)
VALUES
('$_POST[hours]')";

上面的sql代码不包含对用户标识的任何引用。 mysql应该如何猜测这个离开条目的用户属于哪个?在insert语句的列和值部分中包含tge用户标识。可能你应该在php会话中存储用户ID。

答案 1 :(得分:0)

看起来我已经开始了。我的表单中基本上有一个带有用户ID的隐藏字段。提交表格时,会将表格信息提交给表格。不确定这是否是正确的方法,但它似乎工作。

表单代码:

<input type="number" name="hours" value="" />
    <label>id: </label>
    <input type="text" name="id" value="<?php
    echo htmlentities($_SESSION['user']['id'], ENT_QUOTES, 'UTF-8');
    ?>" /> <br /><br />
    <input type="submit" class="btn btn-info" name="submit"  value="Submit"   />

SQL:

$sql = "INSERT INTO leavetable ( hours, users_id )
VALUES ( '{$mysqli->real_escape_string($_POST['hours'])}',
         '{$mysqli->real_escape_string($_POST['id'])}' )";
$insert = $mysqli->query($sql);

有效。这是解决这个问题的最好方法吗?