Страница 1 из 1

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

Добавлено: 2012-01-12 22:38:08
Alex Keda
имеем такие две связанные таблички:

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

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 перееду...)

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

Добавлено: 2012-01-12 22:55:18
hizel
это правильное поведение, REFERENCES проверяет в другую сторону
(меня интересует с позиции портирования - щас я на 5.1 - а завтра может на 5.5 или вообще MariaDB перееду...)
выбери уже postgresql - стабильность, лицензия и нормальная СУБД

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

Добавлено: 2012-01-12 23:07:42
Alex Keda
да нет, именно в ту сторону

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

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

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

Добавлено: 2012-01-12 23:31:36
hizel
а в эту сторону, ну да

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

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".
если сломают - будут полными уродами

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

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

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

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

Добавлено: 2012-01-13 7:51:08
Alex Keda
мне как раз и надо, чтобы можно было создать строку без ссыки на внешний ключ
(заказ внешний, пока он не оплачен - лицензии нет, а значит не на что ссылаться в таблице лицензий - ошмётки таблицы заказов - для эксперимента были созданы)

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

Добавлено: 2012-01-13 9:13:17
hizel
бизнесъ логика в мускуле? - сочувствуем

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

Добавлено: 2012-01-13 15:09:15
Alex Keda
сочувствуй дальше
а я уже реализовал