Как получить внешний ключ и таблицу INSERT INTO (MySQL / InnoDB) - PullRequest
0 голосов
/ 14 ноября 2011

Я делаю все ниже из командной строки и / или mysql> подсказка.

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

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

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

1 Ответ

2 голосов
/ 14 ноября 2011

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

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курс.Может быть, есть «неизвестный владелец» по умолчанию в таблице владельцев и вернуть его из функции, если владелец не найден?С уважением ...

...