2015-03-21 4 views
0

Я хочу создать базу данных mysql с внешними ключами. Но когда я вставляю некоторые тестовые данные, я замечаю, что когда я смотрю в таблицах tblcontact и tbladdress, мой внешний ключ равен нулю. Я знаю его основной вопрос, но можете ли вы дать некоторые предложения?Работа в mysql с внешними ключами

CREATE TABLE tblCustomers (
customerID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
firstname VARCHAR(30) NOT NULL, 
lastname VARCHAR(30) NOT NULL, 
vat VARCHAR(30) NOT NULL, 
customerVisible varchar(1) NOT NULL DEFAULT 'T' 
); 


CREATE TABLE tblContact (
contactID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
email VARCHAR(100), 
phone VARCHAR(100), 
customerID int, 
CONSTRAINT FK_customerID FOREIGN KEY (customerID) REFERENCES tblCustomers(customerID) 
); 

CREATE TABLE tblAddress (
addressID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
street VARCHAR(100), 
houseNumber VARCHAR(15), 
city VARCHAR (100), 
country VARCHAR (100), 
customerID int, 
CONSTRAINT FK_customerIDa FOREIGN KEY (customerID) REFERENCES tblCustomers(customerID) 
); 

INSERT INTO tblCustomers (firstname, lastname,vat) VALUES ("John","Doe","UV45856855"); 
INSERT INTO tblContact (email, phone) VALUES ("0000001","[email protected]"); 
INSERT INTO tblAddress (street,housenumber,city,country) VALUES ("berkenlaan","1a","Harelbeke","Belgie"); 
+0

Итак, вы ожидаете, что DB каким-то образом выведет идентификатор клиента с адреса электронной почты? – user27636

ответ

0

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

Его не является автоматическим .. Вы должны войти в customerId из tblCustomer в tblAddress и tblContact вручную, чтобы содержать зависимость.

Вы не сделали этого в своем коде .. вот почему вы получаете нуль. Как mysql знает, что данные, которые вы вводите в tblAddress и tblContact, относятся к конкретному клиенту?

Если вы хотите, чтобы это произошло автоматически, вы можете создать триггер с использованием LAST_INSERT_ID().

Пример: -

CREATE TRIGGER tblAddress_auto_insert AFTER INSERT ON `tblAddress` 
FOR EACH ROW 
BEGIN 
    INSERT INTO tblAddress (customerID) VALUES (LAST_INSERT_ID()); 
END; 

Аналогично сделать это для tblContact.

НТН

+0

Когда я пытаюсь использовать ваш триггер, он дает мне синтаксическую ошибку в INSERT INTO tblAddress (customerID) VALUES (LAST_INSERT_ID()); Отсутствует «semicolon» – Greg

+0

ok .. я пытаюсь это сделать. –

+0

Я не получаю пропавшую ошибку «semicolon». –

0

Одной из причин этого может быть ваш двигатель базы данных по умолчанию MyISAM. Измените его на InnoDB при создании базы данных или вручную, используя phpmyadmin.

+0

Я изменяю таблицы в innoDB, но я все равно получаю тот же результат. – Greg

0

Вы не вставляя никаких значений в указанных столбцах в tblcontact и tbladdress. Эти столбцы не будут заполняться автоматически. Вы можете попробовать:

INSERT INTO tblCustomers (firstname, lastname,vat) 
VALUES ("John","Doe","UV45856855"); 
INSERT INTO tblContact (customerID,email, phone) 
VALUES ((SELECT DISTINCT LAST_INSERT_ID() FROM tblCustomers), "0000001","[email protected]"); 
INSERT INTO tblAddress (customerID,street,housenumber,city,country) 
VALUES ((SELECT DISTINCT LAST_INSERT_ID() FROM tblCustomers), "berkenlaan","1a","Harelbeke","Belgie"); 

Другой способ может быть на языке сервера, который вы используете. Вы можете создать объект запроса первой вставки и затем найти его последнее вставленное значение.

+0

Спасибо, теперь работает выглядит логика, теперь я вижу это;) – Greg

Смежные вопросы