Доброго времени! не буду открывать новую тему, дабы есть подобная.Вопрос в следующем, связь данных с одной таблицы со сворой. В наличии. Код (Text): CREATE TABLE `#__goods` ( `goods_id` int(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Товар id', `goods_commonid` int(50) unsigned NOT NULL COMMENT '....', `goods_name` varchar(150) NOT NULL COMMENT '....', `goods_jingle` varchar(150) DEFAULT '' COMMENT '....', `store_id` int(20) unsigned NOT NULL COMMENT 'ID магазина', `store_name` varchar(150) NOT NULL COMMENT '....', `gc_id` int(20) unsigned NOT NULL COMMENT '....', .............. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Таблица объектов' AUTO_INCREMENT=100000 ; Добавляю новую с синхронизацией данных с первой. а именно столбцов `store_id`,`goods_id`, необходимо чтобы данные в 2-й таблице были идентичны с данными (брались) в первой, а именно в столбцах указанных в начале предложения... Код (Text): CREATE TABLE `#__goods_map` ( `map_id` int(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Карта ID', `store_id` int(20) unsigned NOT NULL COMMENT 'ID магазина', `goods_id` int(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Товар id', .... PRIMARY KEY (`map_id`), KEY `store_id` (`store_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='....'; Этот вариант работает, но, значения в нем уникальны, а мне необходимо чтобы они брались с первого варианта... Дабы удаляя товар, удалялась автоматом точка на карте. Используя foreign ключ, пишу следующие 2 варианта: Код (Text): PRIMARY KEY (`map_id`), KEY `store_id` (`map_id`,`goods_id`,`store_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='....'; или PRIMARY KEY (`map_id`), KEY `store_id` (`store_id`,`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='....'; Инфа скудна, а то что есть уж не рассчитана на аудиторию вне глубокого изучения... Вопросы. Какой вариант более правильный? Я правильно понимаю работу ключа foreign? Удаляя данные с первой таблицы, удалятся данные и со второй? Если не правильно, прошу поправить, или дать рекомендации. 2-е. Нужно ли писать допы в самом коде, для реализации данного функционала?
я никогда не удаляю ничего, а то другие связи сыпятся тоже. Флаг держу для этого, его ставлю в больше нуля, согласно причине удаления. --- Добавлено --- и в нижнем куске кода я не вижу внешних ключей
разъясните пожалуйста, что значит внешний ключ, видно я не понимаю взаимосвязи нужным образом. Разве `store_id`,`goods_id` не есть ключи? Или надо так Код (Text): PRIMARY KEY (`map_id`,`goods_id`,`store_id`)),
ты сказал про foreign а тут primary primary это просто уникальный ключ а foreign - внешние ключи, по которым можно организовать каскадное удаление.
Понял вроде, Спасибо что направили в нужное русло! по идей добавить Код (Text): CONSTRAINT `FK1` FOREIGN KEY (`map_id`, `store_id`, `goods_id`) REFERENCES `` () Буду тестировать, на ошибках быстрее понимание приходит) Спасибо еще раз!
Вроде не поехали, все нормально, но еще протестирую на всякий случай. При удалении товара (удаление данных с первой таблицы), удаляется и точка на карте. Спасибо за подсказку!
если товар продали в точке на карте, и в/от этой точке деньги учли, то эту запись уже не удалить. А если ты удалишь точку, в которой это произошло, то это будет получается что событие осталось, а точки-то уже нет. =(
Там Карта идет независимо, поэтому и хочу сделать чтобы точка на карте синхронизировалась с уником товара, нет товара, нет точки, айди магазина - остается в любом случае, в силу того что фильтр товаров идет по магазину, по унику товара, по классификациям товара. Товар единичный, и даже если он будет не единичным, то пока не произведут выборку, Товар не удалится, а значит и точка не удалится. В связи с этим я хочу привязать именно к goods_id - товар, map_id, store_id работают, - было по умолчанию, но это слишком широкое поле, я хочу его сузить до точки - для товара, а не как сейчас, точка магазина. Но что-то все не выходит) Где то сидит то чего не вижу или не поиму(
не синхронизируется goods_id. Создается товар, потом карта, но карта не берет значение goods_id у товара.
CONSTRAINT `FOREIGN KEY (``goods_id``)` FOREIGN KEY (`goods_id`) REFERENCES `*_goods` (); /* Ошибка SQL (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CONSTRAINT `FOREIGN KEY (``goods_id``)` FOREIGN KEY (`goods_id`) REFERENCES `10r' at line 1 */ /* mysql_thread_end, thread id #6212 */ /* Затронуто строк: 0 Найденные строки: 0 Предупреждения: 0 Длительность 0 of 1 запрос: 0,000 sec. */ и все тут))))) Ладно, я упертый, не мытьем так катаньем)
CONSTRAINT `FOREIGN KEY это не отдельный запрос, а часть оператора create table или alter table дополнительно см: -) хорошее короткое объяснение что такое внешние ключи -) статья про ошибки внешних ключей
Спасибо парням за наметки! Вот тут еще по поводу SQL Foreign Key, в дополнение к ссылкам, данными retvizan, кстати, он же подсказал как должно быть правильно, в данной ссылке представлено более подробно, для понимания внешних ключей.