SQL数据库表的关系?

时间:2011-10-25 14:43:28

标签: mysql sql

我在mysql中有两个表:

CREATE TABLE names (name_ID INT NOT NULL AUTO_INCREMENT, 
       name VARCHAR(40) NOT NULL, PRIMARY KEY (name_ID));

CRETE TABLE surnames (surname_ID INT NOT NULL AUTO_INCREMENT, 
        name_ID INT NOT NULL FOREIGN KEY (name_ID) REFERENCES names (name_ID),
        surnames VARCHAR(40) NOT NULL, PRIMARY KEY(surname_ID));

我的问题是,我需要在SURNAMES表的FOREIGN KEY列中插入什么值?

例如,如果我在NAMES表中输入此数据:

INSERT INTO names VALUES (NULL, 'Pamela');
INSERT INTO names VALUES (NULL, 'Sarah');

我应该在SURNAMES表中使用什么作为FOREIGN KEY?我需要输入什么才能将这两个表关联起来? MySQL如何在姓氏表中对外键中的值进行排序?


这是来自论坛DB的示例:

CREATE TABLE languages (
lang_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
lang VARCHAR(60) NOT NULL,
lang_eng VARCHAR(20) NOT NULL,
PRIMARY KEY (lang_id),
UNIQUE (lang)
);

CREATE TABLE threads (
thread_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
lang_id TINYINT(3) UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
subject VARCHAR(150) NOT NULL,
PRIMARY KEY  (thread_id),
INDEX (lang_id),
INDEX (user_id)
);

CREATE TABLE posts (
post_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
thread_id INT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
message TEXT NOT NULL,
posted_on DATETIME NOT NULL,
PRIMARY KEY (post_id),
INDEX (thread_id),
INDEX (user_id)
);

CREATE TABLE users (
user_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
lang_id TINYINT UNSIGNED NOT NULL,
time_zone VARCHAR(30) NOT NULL,
username VARCHAR(30) NOT NULL,
pass CHAR(40) NOT NULL,
email VARCHAR(60) NOT NULL,
PRIMARY KEY (user_id),
UNIQUE (username),
UNIQUE (email),
INDEX login (username, pass)
);

CREATE TABLE words (
word_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
lang_id TINYINT UNSIGNED NOT NULL,
title VARCHAR(80) NOT NULL,
intro TINYTEXT NOT NULL,
home VARCHAR(30) NOT NULL,
forum_home VARCHAR(40) NOT NULL,
`language` VARCHAR(40) NOT NULL,
register VARCHAR(30) NOT NULL,
login VARCHAR(30) NOT NULL,
logout VARCHAR(30) NOT NULL,
new_thread VARCHAR(40) NOT NULL,
subject VARCHAR(30) NOT NULL,
body VARCHAR(30) NOT NULL,
submit VARCHAR(30) NOT NULL,
posted_on VARCHAR(30) NOT NULL,
posted_by VARCHAR(30) NOT NULL,
replies VARCHAR(30) NOT NULL,
latest_reply VARCHAR(40) NOT NULL,
post_a_reply VARCHAR(40) NOT NULL,
PRIMARY KEY (word_id),
UNIQUE (lang_id)
);

插入外键是我得不到的?例如:

INSERT INTO `threads` (`thread_id`, `lang_id`, `user_id`, `subject`) VALUES
(1, 4, 1, 'Byttet til PHP 5.0 fra PHP 4.0 - variabler utilgjengelige'),
(2, 4, 2, 'Automatisk bildekontroll'),
(3, 3, 5, 'Lancer une Page HTML en PHP'),
(4, 3, 4, 'Ajouter des adresses a PHP List depuis un formulaire'),
(5, 9, 4, 'Ovo je dio teksta koji se ubacuje u forum'),
(7, 1, 1, 'Sample Thread');

这里有Thread_id,lang_id,外键吗?如果不是,它们是手动插入的吗?如果是,是否手动插入?大声笑

3 个答案:

答案 0 :(得分:4)

我注意到我确定我理解你需要什么,我不明白为什么你要将姓氏与姓名联系起来。
无论如何,当您在名称中使用INSERT INTO names VALUES (NULL, 'Pamela')时,会创建表格(比如说 1 ,因为第一次插入了);所以,如果你想创建一个与名字 Pamela 相关的姓氏,你应该INSERT INTO surnames (NULL, 1, 'Anderson')
第二个相同(例如,其ID为 2 INSERT INTO surnames (NULL, 2, 'Gellar')

MySQL如何在姓氏表中对外键中的值进行排序
你需要什么?为什么这很重要?

在新示例之后编辑
您的线程表不包含任何foreigh键; user_id应该与users表相关,因为lang_id可能应该被用于语言表,但它们不是.b。 我唯一看到的是,如果您在WHEREORDER BY条件下使用它们,则lang_id和user_id字段都有一个索引可以使查询更快。
设计数据库时必须声明外键,而不是查询!
您可以“逻辑地”关联在父表和子表中插入相同ID的字段,但它不完全相同。

答案 1 :(得分:0)

我会创建另一个表id | name_id | surname_id,并在那里插入名称的ID。查看InnoDB

答案 2 :(得分:-1)

插入数据后,您必须插入name_id的任何值。 name_id字段似乎是一个标识列,因此每当您在names表中插入一行时,该列应自动填充(从1开始并在添加更多行时递增)。

也就是说,您不应该尝试将'NULL'插入name_id列,因为您已将其定义为NOT NULL。