Связь между таблицами базы данных SQL?

#mysql #sql

#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));
 

Мой вопрос в том, какие значения мне нужно вставить в столбец ВНЕШНЕГО КЛЮЧА в таблице ФАМИЛИЙ?

Например, если я введу эти данные в таблицу ИМЕН:

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

Что я должен использовать в качестве ВНЕШНЕГО КЛЮЧА в таблице ФАМИЛИЙ? Что мне нужно ввести здесь, чтобы эти две таблицы были связаны? Как MySQL сортирует значения по внешнему ключу в таблицах фамилий?


это пример из forum 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, внешние ключи? Если нет, то они вставляются вручную? Если да, вставлены ли они вручную? лол

Комментарии:

1. Я не могу понять, чего вы пытаетесь достичь с помощью ФАМИЛИЙ таблиц. Пожалуйста, предоставьте лучшее объяснение.

2. Разве наши ответы не объяснили, что вам нужно?

3. Большинство не понимает, поэтому я хочу добавить больше кода. Я знаю, что всем это скучно читать, поэтому вначале я попробовал использовать небольшой код. Теперь у меня нет выбора

4. Хороший вопрос может заключаться в следующем: нужно ли мне, чтобы все значения соответствовали друг другу, как в этом последнем запросе? Чтобы увидеть, что такое LANG_ID для этой строки и добавить его, что такое USER_ID для конкретной строки и добавить ее и т.д.

Ответ №1:

Я уверен, что понимаю, что вам нужно, и я не понимаю, почему вы связываете фамилию с именем.
В любом случае, когда вы используете INSERT INTO names VALUES (NULL, 'Pamela') идентификатор в таблице имен, создается таблица (скажем, это 1, потому что вставлено первое); так что, если вы хотите создать фамилию, связанную с именем Памела, вы должны это сделать INSERT INTO surnames (NULL, 1, 'Anderson') .
То же самое для второго (скажем, его идентификатор равен 2) INSERT INTO surnames (NULL, 2, 'Gellar') .

Как MySQL сортирует значения по внешнему ключу в таблицах фамилий?
Что вам нужно? Почему это важно?

ОТРЕДАКТИРОВАНО после нового примера:
ваша таблица потоков не содержит никакого ключа foreigh; user_id вероятно, должно быть связано с таблицей users, поскольку lang_id, вероятно, должен быть привязан к таблице languages, но это не так.
Единственное, что я вижу, это то, что оба поля lang_id и user_id имеют индекс, чтобы запросы выполнялись быстрее, если вы используете их в WHERE условии или ORDER ПО условию.
Внешние ключи должны быть объявлены при проектировании базы данных, а не с помощью запросов!!
Вы можете «логически» связать поля, вставляя один и тот же идентификатор как в родительскую, так и в дочернюю таблицу, но это не совсем одно и то же.

Комментарии:

1. спасибо, братан, теперь я понимаю, что в этих таблицах нет внешних ключей

Ответ №2:

Я бы создал другую таблицу id | name_id | surname_id и, ну, вставил туда идентификаторы имен. Проверьте InnoDB

Комментарии:

1. У меня тоже есть проблемы с name surname настройкой / table . Это, безусловно, один из доступных вариантов (и, вероятно, самый простой). Хотя на самом деле это не отвечает на реальный вопрос…

Ответ №3:

Вам нужно будет вставить любое значение name_id после вставки ваших данных. name_id Поле выглядит как идентификационный столбец, поэтому всякий раз, когда вы вставляете строку в names таблицу, этот столбец должен заполняться автоматически (начиная с 1 и увеличиваясь по мере добавления новых строк).

Тем не менее, вы не должны пытаться вставить ‘NULL’ в name_id столбец, поскольку вы определили его как NOT NULL.

Комментарии:

1. «вы не должны пытаться вставить ‘NULL’ в столбец name_id, поскольку вы определили его как NOT NULL» : это поле таково AUTO_INCREMENT , что при передаче NULL новое значение (инкрементное) генерируется автоматически из движка!!