SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.02.2009 19:33:49

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Ошибка при создании FOREIGN ключа

ALTER TABLE `adv`.`views` ADD CONSTRAINT `FK_views_1` FOREIGN KEY `FK_views_1` (`active`, `position`, `zone`)
    REFERENCES `banners` (`active`, `position`, `zone`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT


такой запрос выдаёт: #1005 - Can't create table './adv/#sql-78e_1a4f.frm' (errno: 150)

Делаю запрос с удалённой машины. Сформировал его Mysql Query Browser. Попытался его же через phpmyadmin - таже фигня.
Сообственно, где проблема? Просто никогда не создавал пока такие ключи, потому не сталкивался.

Неактивен

 

#2 28.02.2009 19:44:58

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Ошибка при создании FOREIGN ключа

Есть ли в таблице banner составной ключ на (`active`, `position`, `zone`) ?

Неактивен

 

#3 28.02.2009 19:59:52

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Ошибка при создании FOREIGN ключа

position
zone
active

такой ключик есть

сделал индекс в поряжке active, position, zone - толку никакого. Та же ошибка.

Отредактированно Proger (28.02.2009 20:01:52)

Неактивен

 

#4 28.02.2009 20:20:08

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Ошибка при создании FOREIGN ключа

Порядок следования колонок в ключе важен.

Приведите SHOW CREATE TABLE views и SHOW CREATE TABLE banners

Неактивен

 

#5 28.02.2009 20:22:49

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Ошибка при создании FOREIGN ключа

пожалуйста:

CREATE TABLE `views` (
  `bid` int(4) NOT NULL auto_increment,
  `active` enum('da','net') NOT NULL,
  `zone` enum('map','blog','forum','file','photo','page','all','reg','index','er404') NOT NULL,
  `allowview` bigint(15) NOT NULL,
  `allview` bigint(15) NOT NULL,
  `position` enum('top','upper','footer') NOT NULL,
  PRIMARY KEY  (`bid`)
) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=31 ;

CREATE TABLE `banners` (
  `id` int(4) NOT NULL auto_increment,
  `position` enum('top','upper','footer') NOT NULL default 'top',
  `code` varchar(500) NOT NULL,
  `click` int(8) NOT NULL,
  `zone` enum('map','blog','forum','file','photo','page','all','reg','index','er404') NOT NULL default 'all',
  `active` enum('da','net') NOT NULL,
  `link` varchar(250) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `active` (`active`,`position`,`zone`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=31 ;

Неактивен

 

#6 28.02.2009 20:39:54

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Ошибка при создании FOREIGN ключа

ENGINE=MyISAM - обе таблицы должны быть innodb

Неактивен

 

#7 28.02.2009 20:42:27

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Ошибка при создании FOREIGN ключа

Гм... как-то и не подумал даже. Сделал. Теперь пишет:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`adv/#sql-78e_1f76`, CONSTRAINT `FK_views_1` FOREIGN KEY (`active`, `position`, `zone`) REFERENCES `banners` (`active`, `position`, `zone`))

Неактивен

 

#8 28.02.2009 20:47:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Ошибка при создании FOREIGN ключа

Ну значит сейчас в этих двух таблицах условия внешнего ключа не выполняются, то есть в stat есть тройки (active, position, zone), которых в banners нет. Логично перед тем, как наложить ограничение на данные, привести их в соответствие с ограничением.

В текущей ситуации не очень понимаю зачем foreign key

Неактивен

 

#9 28.02.2009 20:48:26

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Ошибка при создании FOREIGN ключа

мммм... что-то значит я не понял. Мне надо просто чтобы значения из banners автоматом транслировались в табличку views

Неактивен

 

#10 28.02.2009 20:50:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Ошибка при создании FOREIGN ключа

Если views - статистика, то можно обновлять в ней информацию
INSERT INTO views VALUES (..) ON DUPLICATE KEY UPDATE allview=allview+1

Автоматом транслировать данные можно только триггерами

Неактивен

 

#11 28.02.2009 20:54:41

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Ошибка при создании FOREIGN ключа

views статистика кликов по баннерам. Идут запросы только UPDATE к таблице views.

Хм... тогда наверное проще при выборке подгружать. А триггеры это в 5.0.10 mysql есть? ну и собственно мне не важно как, но хотелось бы оное реализовать.

Неактивен

 

#12 28.02.2009 21:01:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Ошибка при создании FOREIGN ключа

UPDATE можно заменить на INSERT ... ON DUPLICATE KEY UPDATE

Триггеры есть в 5.0, но решение через триггеры будет менее устойчивым, так как придется следить и за вставкой новых баннеров и за изменениями существующих

Неактивен

 

#13 27.07.2009 09:56:28

BulchonokN
Участник
Зарегистрирован: 27.07.2009
Сообщений: 5

Re: Ошибка при создании FOREIGN ключа

Здравствуйте!
У меня похожая ситуация.
Есть две таблички:
CREATE TABLE `Teploobm` (
`id_teploobm` INT( 4 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`name_teploobm` VARCHAR( 50 ) NOT NULL ,
`kind_teploobm` VARCHAR( 30 ) ,
PRIMARY KEY ( `id_teploobm` )
) TYPE = InnoDB COMMENT = 'Таблица, содержащая информацию о теплообменниках';

и

CREATE TABLE `Komplekt_teploobm` (
`num_teploobm` INT( 4 ) NOT NULL ,
`num_zapch` INT( 4 ) NOT NULL ,
`count` INT( 3 ) NOT NULL ,
PRIMARY KEY ( `num_teploobm` , `num_zapch` )
) TYPE = InnoDB COMMENT = 'Таблица комплектующих теплообменника';

Мне нужно установить в таблице Komplekt_teploobm на столбец num_teploobm внешний ключ, ссылающийся

 
на таблицу Teploobm столбец id_teploobm.

Пишу так:
ALTER TABLE `Komplekt_teploobm` ADD CONSTRAINT FOREIGN KEY `FK_Kt1` REFERENCES `Teploobm` ( `id_teploobm` )  ON DELETE RESTRICT  ON UPDATE CASCADE

#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 'REFERENCES `Teploobm` (`id_teploobm`)
    ON DELETE RESTRICT
    ON UPDATE CAS' at line 1
ЧТО-ТО Я УЖЕ ЗАПАРИЛАСЬ, ВООБЩЕ НЕ ТО.
ну в общем что не так, можете подсказать. пожалуйста.

Неактивен

 

#14 27.07.2009 16:03:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Ошибка при создании FOREIGN ключа

Посмотрите внимательно на синтаксис — Вы не указываете, какая колонка должны ссылаться на
другую таблицу: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

В Вашем случае должно быть что-то типа ADD FOREIGN KEY (num_teploobm) REFERENCES Teploobm (id_teploobm)

Неактивен

 

#15 08.08.2009 19:30:50

BulchonokN
Участник
Зарегистрирован: 27.07.2009
Сообщений: 5

Re: Ошибка при создании FOREIGN ключа

Спасибо! эту проблему я решила, теперь выскакивает следующая ошибка.
Пишу так:
ALTER TABLE `Komplekt_teploobm` ADD FOREIGN KEY ( `num_teploobm` ) REFERENCES `Teploobm` ( `id_teploobm` ) ON DELETE RESTRICT ON UPDATE CASCADE

#1005 - Can't create table '.\teploobmennnik\#sql-b94_8.frm' (errno: 150)
Вот! Собственно с этой ошибкой были проблемы.

Неактивен

 

#16 09.08.2009 05:18:11

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5838

Re: Ошибка при создании FOREIGN ключа

Оператор ALTER TABLE работает, создавая временную копию исходной таблицы. Изменения осуществляются на копии, затем исходная таблица удаляется и новая переименовывается. Приведенная вами ошибка указывает на то, что таблица не может быть создана по причине неправильного оформленного внешнего ключа. (http://dev.mysql.com/doc/refman/5.0/en/ … codes.html)

Смотрим документацию по определению внешнего ключа http://dev.mysql.com/doc/refman/5.0/en/ … aints.html

1.  Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same.

В вашем случае `id_teploobm` определена как UNSIGNED, а `num_teploobm` - нет.
Соответственно нужно или убрать UNSIGNED из определения `id_teploobm`, или `num_teploobm` определить как UNSIGNED. Например,

 ALTER TABLE `Komplekt_teploobm` MODIFY `num_teploobm` INT(4) UNSIGNED NOT NULL;

Неактивен

 

#17 09.08.2009 10:45:31

BulchonokN
Участник
Зарегистрирован: 27.07.2009
Сообщений: 5

Re: Ошибка при создании FOREIGN ключа

большое спасибо!!! smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson