СУБД под BSD/UNIX: PostgreSQL, MySQL и другие. Установка, настройка, репликация, резервное копирование и оптимизация.
Модератор: terminus
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
Alex Keda
- стреляли...
- Сообщения: 35501
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
-
Контактная информация:
Непрочитанное сообщение
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), я могу добавить
и это пркоанает.
т.е. - поле OrderID - это внешний ключ.
то, что я могу в него воткнуть NULL и MySQL это лопает - это нормальное поведение или фича?
(меня интересует с позиции портирования - щас я на 5.1 - а завтра может на 5.5 или вообще MariaDB перееду...)
Убей их всех! Бог потом рассортирует...
Alex Keda
-
Хостинг HostFood.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
- Откуда: Выборг
Непрочитанное сообщение
hizel » 2012-01-12 22:55:18
это правильное поведение, REFERENCES проверяет в другую сторону
(меня интересует с позиции портирования - щас я на 5.1 - а завтра может на 5.5 или вообще MariaDB перееду...)
выбери уже postgresql - стабильность, лицензия и нормальная СУБД
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.
hizel
-
Alex Keda
- стреляли...
- Сообщения: 35501
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
-
Контактная информация:
Непрочитанное сообщение
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
Убей их всех! Бог потом рассортирует...
Alex Keda
-
hizel
- дядя поня
- Сообщения: 9032
- Зарегистрирован: 2007-06-29 10:05:02
- Откуда: Выборг
Непрочитанное сообщение
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".
если сломают - будут полными уродами
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.
hizel
-
FiL
- ст. лейтенант
- Сообщения: 1377
- Зарегистрирован: 2010-02-05 0:21:40
Непрочитанное сообщение
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 таблице значение - это плохо. Потому и не даёт сделать.
FiL
-
Alex Keda
- стреляли...
- Сообщения: 35501
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
-
Контактная информация:
Непрочитанное сообщение
Alex Keda » 2012-01-13 7:51:08
мне как раз и надо, чтобы можно было создать строку без ссыки на внешний ключ
(заказ внешний, пока он не оплачен - лицензии нет, а значит не на что ссылаться в таблице лицензий - ошмётки таблицы заказов - для эксперимента были созданы)
Убей их всех! Бог потом рассортирует...
Alex Keda
-
hizel
- дядя поня
- Сообщения: 9032
- Зарегистрирован: 2007-06-29 10:05:02
- Откуда: Выборг
Непрочитанное сообщение
hizel » 2012-01-13 9:13:17
бизнесъ логика в мускуле? - сочувствуем
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.
hizel
-
Alex Keda
- стреляли...
- Сообщения: 35501
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
-
Контактная информация:
Непрочитанное сообщение
Alex Keda » 2012-01-13 15:09:15
сочувствуй дальше
а я уже реализовал
Убей их всех! Бог потом рассортирует...
Alex Keda