Jump to content
Sign in to follow this  
taviroquai

alter table devolve erro 150

Recommended Posts

taviroquai

Viva,

Estou a obter o erro 150 ao tentar adicionar uma chave externa mesmo depois de verificar várias hipoteses...

Já verifiquei:

  • Que ambas as tabelas têm o mesmo CHARACTER SET e COLLATION
  • Que ambos os campos têm o mesmo CHARACTER SET e COLLATION
  • Que ambos os campos têm a mesma definição (UNSIGNED e NOT NULL), embora como é obvio, o campo ID é AUTOINCREMENT.
  • Que a chave externa está indexada.
  • Que ambas as tabelas têm o mesmo motor InnoDB.

Segue o SQL:

--
-- Table `demo_user`
--
CREATE TABLE IF NOT EXISTS `demo_user` (
 `id` int(11) NOT NULL,
 `email` varchar(60) NOT NULL,
 `password` varchar(80) NOT NULL,
 PRIMARY KEY (`id`)
);

ALTER TABLE `demo_user` MODIFY COLUMN `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE `demo_user` CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `demo_user` ENGINE=InnoDB;

--
-- Table `demo_group`
--
CREATE TABLE IF NOT EXISTS `demo_group` (
 `id` int(11) NOT NULL,
 `name` varchar(60) NOT NULL,
 PRIMARY KEY (`id`)
);

ALTER TABLE `demo_group` MODIFY COLUMN `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE `demo_group` CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `demo_group` ENGINE=InnoDB;

--
-- Table `user_group`
--
CREATE TABLE IF NOT EXISTS `demo_usergroup` (
 `id` int(11) UNSIGNED NOT NULL,
 `id_user` int(11) UNSIGNED NOT NULL,
 `id_group` int(11) UNSIGNED NOT NULL,
 PRIMARY KEY (`id`)
);

ALTER TABLE `demo_usergroup` CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `demo_usergroup` ENGINE=InnoDB;
CREATE INDEX `user_fk_idx` ON `demo_usergroup` (`id_user`);
CREATE INDEX `group_fk_idx` ON `demo_usergroup` (`id_group`);
ALTER TABLE `demo_usergroup` ADD CONSTRAINT `user_fk` FOREIGN KEY (`id_user`) REFERENCES `demo_user`.`id` ON UPDATE NO ACTION ON DELETE NO ACTION;
ALTER TABLE `demo_usergroup` ADD CONSTRAINT `group_fk` FOREIGN KEY (`id_group`) REFERENCES `demo_group`.`id` ON UPDATE NO ACTION ON DELETE NO ACTION;

O erro é o seguinte:

Error
SQL query:
ALTER TABLE `demo_usergroup` ADD CONSTRAINT `user_fk` FOREIGN KEY ( `id_user` ) REFERENCES `demo_user`.`id` ON UPDATE NO ACTION ON DELETE NO ACTION ;
MySQL said:
#1005 - Can't create table 'architect.#sql-4a9_143b' (errno: 150)

Espero que não seja um typo... :confused:

Edited by taviroquai

Share this post


Link to post
Share on other sites
HappyHippyHippo
--
-- Table `demo_user`
--
CREATE TABLE IF NOT EXISTS `demo_user` (
 `id` INT(11) AUTO_INCREMENT PRIMARY KEY,
 `email` VARCHAR(60) NOT NULL,
 `password` VARCHAR(80) NOT NULL
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;

--
-- Table `demo_group`
--
CREATE TABLE IF NOT EXISTS `demo_group` (
 `id` INT(11) AUTO_INCREMENT PRIMARY KEY,
 `name` VARCHAR(60) NOT NULL
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;

--
-- Table `user_group`
--
CREATE TABLE IF NOT EXISTS `demo_usergroup` (
 `id` INT(11) AUTO_INCREMENT PRIMARY KEY,
 `id_user` INT(11),
 `id_group` INT(11),
  FOREIGN KEY `user_fk` (`id_user`) REFERENCES `demo_user` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
  FOREIGN KEY `group_fk` (`id_group`) REFERENCES `demo_group` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
taviroquai

Tá boa... então mas com as instruções ALTER TABLE em separado não era suposto funcionar? É isso que me está aqui a roer os miolos... Gostava de manter aquelas instruções em separado...

Share this post


Link to post
Share on other sites
HappyHippyHippo

o teu problema parece estar aqui:

... REFERENCES `demo_user`.`id` ...

correcto será : NOME_TABELA (NOME_CAMPO [| NOME_CAMPO])

... REFERENCES `demo_user` (`id`) ...

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
taviroquai

Juro que tinha experimentado essa syntax mas provavelmente nessa altura o erro seria outro... é o que dá apenas 1 código de erro para tantas situações... Obrigadão! :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.