[MySQL] вопросик по внешним ключам

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

[MySQL] вопросик по внешним ключам

Непрочитанное сообщение Alex Keda » 2012-01-12 22:38:08

имеем такие две связанные таблички:

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `Orders` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `OrderDate` int(11) DEFAULT '0',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

CREATE TABLE IF NOT EXISTS `HostingOrders` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `OrderID` int(11) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `HostingOrdersOrderID` (`OrderID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

ALTER TABLE `HostingOrders`
  ADD CONSTRAINT `HostingOrdersOrderID` FOREIGN KEY (`OrderID`) REFERENCES `Orders` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE;
дык вот во вторую (HostingOrders), я могу добавить

Код: Выделить всё

NULL,NULL
и это пркоанает.
т.е. - поле OrderID - это внешний ключ.
то, что я могу в него воткнуть NULL и MySQL это лопает - это нормальное поведение или фича?
(меня интересует с позиции портирования - щас я на 5.1 - а завтра может на 5.5 или вообще MariaDB перееду...)
Убей их всех! Бог потом рассортирует...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: [MySQL] вопросик по внешним ключам

Непрочитанное сообщение hizel » 2012-01-12 22:55:18

это правильное поведение, REFERENCES проверяет в другую сторону
(меня интересует с позиции портирования - щас я на 5.1 - а завтра может на 5.5 или вообще MariaDB перееду...)
выбери уже postgresql - стабильность, лицензия и нормальная СУБД
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [MySQL] вопросик по внешним ключам

Непрочитанное сообщение Alex Keda » 2012-01-12 23:07:42

да нет, именно в ту сторону

Код: Выделить всё

insert into `HostingOrders` VALUES (NULL,2);
отвечает

Код: Выделить всё

#1452 - Cannot add or update a child row: a foreign key constraint fails (`h9357_support`.`HostingOrders`, CONSTRAINT `HostingOrdersOrderID` FOREIGN KEY (`OrderID`) REFERENCES `Orders` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE)
поскольку в Orders нет ID=2
Убей их всех! Бог потом рассортирует...

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: [MySQL] вопросик по внешним ключам

Непрочитанное сообщение hizel » 2012-01-12 23:31:36

а в эту сторону, ну да

Код: Выделить всё

lor=> CREATE TABLE orders (order_id integer PRIMARY KEY, OrderDate integer);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "orders_pkey" for table "orders"
CREATE TABLE
lor=> create table hosting_orders(id integer primary key, order_id integer references orders);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "hosting_orders_pkey" for table "hosting_orders"
CREATE TABLE
lor=> insert INTO hosting_orders values(1,2);
ERROR:  insert or update on table "hosting_orders" violates foreign key constraint "hosting_orders_order_id_fkey"
DETAIL:  Key (order_id)=(2) is not present in table "orders".
если сломают - будут полными уродами
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: [MySQL] вопросик по внешним ключам

Непрочитанное сообщение FiL » 2012-01-13 6:21:16

Alex Keda писал(а): то, что я могу в него воткнуть NULL и MySQL это лопает - это нормальное поведение или фича?
(меня интересует с позиции портирования - щас я на 5.1 - а завтра может на 5.5 или вообще MariaDB перееду...)
Это нормальное официальное и принятое стандартом поведение. nullable foreign key.
Если оно тебе не надо по дизайну, то ты должен объявить поле как Not null.
А вообще при описании операций по референсу есть даже специальный вариант set sull.

A вот несуществующее в referenced таблице значение - это плохо. Потому и не даёт сделать.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [MySQL] вопросик по внешним ключам

Непрочитанное сообщение Alex Keda » 2012-01-13 7:51:08

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

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: [MySQL] вопросик по внешним ключам

Непрочитанное сообщение hizel » 2012-01-13 9:13:17

бизнесъ логика в мускуле? - сочувствуем
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [MySQL] вопросик по внешним ключам

Непрочитанное сообщение Alex Keda » 2012-01-13 15:09:15

сочувствуй дальше
а я уже реализовал
Убей их всех! Бог потом рассортирует...