【发布时间】:2014-08-08 17:25:05
【问题描述】:
我正在尝试在 MySQL 中创建两个表,并通过用户 ID (uid) 和后 ID (pid) 将它们链接在一起。 users 表有一个自动递增的主键 uid,posts 表有一个主键 pid。帖子表的外键是帖子表的 uid。由于某种原因,posts 表的 uid 列总是 0,而它应该指向 users 表的 uid 值。
CREATE TABLE users
(
uid int NOT NULL AUTO_INCREMENT,
email varchar(100) NOT NULL,
username varchar(100) NOT NULL,
dob varchar(10) NOT NULL,
password varchar(100) NOT NULL,
PRIMARY KEY (uid)
);
CREATE TABLE posts
(
pid int NOT NULL AUTO_INCREMENT,
uid int NOT NULL,
username varchar(100) NOT NULL,
date date NOT NULL,
title varchar(225) NOT NULL,
content mediumtext NOT NULL,
PRIMARY KEY(pid),
FOREIGN KEY(uid) REFERENCES users(uid)
);
两个表的输出为:
mysql> select *from users;
+-----+----------------+-------------+------------+----------+
| uid | email | username | dob | password |
+-----+----------------+-------------+------------+----------+
| 1 | test@test.com | Test User1 | 11/11/1111 | passwor1 |
| 2 | test2@test.com | Test User2 | 22/22/2222 | passwor2 |
| 3 | test3@test.com | Test User 3 | 33/33/3333 | passwor3 |
+-----+----------------+-------------+------------+----------+
3 rows in set (0.00 sec)
mysql> select *from posts;
+-----+-----+-------------+------------+----------------+--------------------------------------------------+
| pid | uid | username | date | title | content |
+-----+-----+-------------+------------+----------------+--------------------------------------------------+
| 1 | 0 | Test User 3 | 2014-08-08 | Test Post | TEST
| 2 | 0 | Test User 3 | 2014-08-08 | Test Post 2 | Test post please ignore
| 3 | 0 | Test User 3 | 2014-08-08 | TEST AGAIn | Test test test test test
+-----+-----+-------------+------------+----------------+--------------------------------------------------+
3 rows in set (0.00 sec)
根据上面的数据,uid 列应该是“3”,这是在 users 表中定义的测试用户 3 的 uid。相反,uid 列始终为 0。
有什么想法吗?
谢谢。
【问题讨论】:
-
你能分享一下你用来用这些行填充表格的插入语句吗?
-
外键值不会被神奇地填充,但必须在
INSERT语句中输入。它旨在确保参照完整性。 IE。您不能为不存在的客户生成订单。您应该查看INSERT脚本,或者在此处也提供该脚本。 -
您是否真的在创建新帖子记录时将 uid 值插入帖子中?这不会因为您创建了外键而神奇地发生。
-
您很困惑,因为您在其上创建了 FK,所以 post 表中的 uid 会自动填写。不,您必须相应地插入数据。这里没有自动业务。
-
是的,就是这样。我想我完全误解了外键的实际功能。我会修改我的插入语句。谢谢!