2011-11-14 3 views
0

Я делаю все ниже из командной строки и/или mysql>.Как получить внешний ключ и таблицу INSERT INTO (MySQL/InnoDB)

Я новичок в БД и заметил, что в структуре (учебниках) и определениях (руководствах) есть много сайтов, но нет никаких практических примеров. Если у меня есть две таблицы, как так

CREATE TABLE IF NOT EXISTS owner 
(
    ID INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL UNIQUE, 
    PRIMARY KEY(ID) 
)ENGINE=InnoDB 


CREATE TABLE IF NOT EXISTS dog 
(
    ID INT NOT NULL AUTO_INCREMENT, 
    owner INT NOT NULL, 
    name VARCHAR(32) NOT NULL UNIQUE, 
    PRIMARY KEY(ID), 
    FOREIGN KEY (owner) REFERENCES owner(ID) 
)ENGINE=InnoDB 

И если я хочу, чтобы добавить в таблицу собаку

INSERT INTO dog (owner, name) VALUES(get_owner_ID("Peter Griffin"), "Brian Griffin"); 

Как получить зашифрованный идентификатор владельца от имени («Питер Гриффин»)

+0

Прежде чем делать 'insert', вы должны сначала« выбрать »идентификатор для Peter (в зависимости от вашей бизнес-логики). – kan

+0

@kan, где я теряюсь. Если я делаю 'select ID от владельца, где name =" Peter Griffin ", он возвращает таблицу, а не int. Как вы получаете единственное значение, и где я его «храню»? Использую ли я его как составной оператор – puk

+0

Просто выполните два отдельных запроса - выберите и вставьте. И проверьте, возвращена ли только одна запись (это означает, что только одна запись имеет имя = «Питер»). – kan

ответ

2

Вы можете либо выполнить подвыбор при вставке в таблицу dog, либо создать свой собственный user defined function. Определенная пользователем функция имеет преимущество перед хранимой процедурой здесь, поскольку она может быть вызвана во время вашей вставки. Следовательно:

CREATE TABLE IF NOT EXISTS owner 
(
    ID INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL UNIQUE, 
    PRIMARY KEY(ID) 
)ENGINE=InnoDB; 

CREATE TABLE IF NOT EXISTS dog 
(
    ID INT NOT NULL AUTO_INCREMENT, 
    owner INT NOT NULL, 
    name VARCHAR(32) NOT NULL UNIQUE, 
    PRIMARY KEY(ID), 
    FOREIGN KEY (owner) REFERENCES owner(ID) 
)ENGINE=InnoDB; 

Теперь создадим функцию:

DELIMITER // 

DROP FUNCTION IF EXISTS get_owner_id// 

CREATE FUNCTION get_owner_id(i_owner_name varchar(32)) returns integer 
READS SQL DATA 
BEGIN 
declare v_owner_id int; 
select id into v_owner_id from owner where name = i_owner_name; 
return v_owner_id; 
END// 

DELIMITER ; 

insert into owner(name) values ('Peter Griffin'); 
insert into dog (owner,name) values (get_owner_id('Peter Griffin'),'Brian Griffin'); 

Вы бы должны придумать способ обработки случай, когда владелец не существует в таблице owner конечно. Может быть, есть «неизвестный владелец» по умолчанию в таблице владельца и возвращает это из функции, если владелец не найден? Kinda до вас ...

+0

Является ли это хорошей идеей или мне нужно просто удалить идентификатор владельца вместе и просто использовать имя в качестве первичного ключа? Единственная причина, по которой я этого не делаю, заключается в том, что каждый веб-сайт (включая этот) говорит, что лучше всего использовать неродственное целое в качестве первичного ключа. – puk

+0

И спасибо за отличные примеры. – puk

+0

Ах. Ну, вы попадаете в липкий мир первичных ключей «естественный против суррогата». Люди, похоже, сражаются с войнами по меньшим вопросам! Лично я думаю, что у вас есть дизайн таблицы (ID = PK, а затем уникальный ключ в столбце имен), и вы должны оставить его как есть. «Суррогатная и естественная» дебаты слишком велики, чтобы вписаться в этот блок комментариев. –

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