MySQL - Problema ao adicionar chave estrangeira à tabela [RESOLVIDO]

9 respostas
P

Boa tarde gente. Criei uma tabela chamada my_contacts e outra jobs e estou tentando inserir uma chave estrangeira na primeira sem êxito. Segue o código abaixo:

ALTER TABLE my_contacts
ADD COLUMN id_prof INT NOT NULL AFTER birthday;
OK, 15 rows affected (0.08 sec)
15  Duplicates: 0  Warnings: 0

ALTER TABLE my_contacts
ADD CONSTRAINT my_contacts_id_prof_fk FOREIGN KEY(id_prof) REFERENCES my_contacts(id_job);
1005 (HY000): Can't create table 'gregslist.#sql-4a4_2' (errno: 150)

Como vocês podem ver, o meu DB é gregslist; a tabela my_contacts é minha parent table e a id_job é a chave primária da minha child table que tem uma referência da foreign key oriunda de my_contacts. Como faço para inserir a chave estrangeira com o comando alter ? Obrigado pela ajuda.

Descobri que a sintaxe estava errada então escrevi:

ALTER TABLE my_contacts
 ADD FOREIGN KEY(id_prof) REFERENCES jobs(id_job);
1005 (HY000): Can't create table 'gregslist.#sql-4a4_2' (errno: 150)

só que continuo com o mesmo erro :?

9 Respostas

I
SET FOREIGN_KEY_CHECKS=0;

Coloque esta linha no inicio de seu script - tente rodar. Se ainda assim der bug, pode ser problema na instalação do seu MySQL.

Espero ter ajudado

P

ibispo:
SET FOREIGN_KEY_CHECKS=0;

Coloque esta linha no inicio de seu script - tente rodar. Se ainda assim der bug, pode ser problema na instalação do seu MySQL.

Espero ter ajudado

Desculpe-me pela demora para responder. Inserir SET FOREIGN_Key_CHEKS = 0; não resolveu o problema : \

I

duvida - como esta sua configuracao do Type - MyISAM, InnoDB, etc…
Ambas as tabelas devem ter o mesmo type.

R

Gera o Script das 2 tabelas em questão e posta aqui.

P

A Engine de ambas as tabelas é InnoDB.

Eu criei a tabela my_contacts assim:

CREATE TABLE my_contacts (
  last_name varchar(30) ,
  first_name varchar(20) ,
  email varchar(50) ,
  gender char(1),
  birthday date ,
  profession varchar(50),
  location varchar(50),
  status varchar(20),
  interests varchar(100),
  seeking varchar(100)
);

aí eu adicionei mais três colunas:

ALTER TABLE my_contacts
ADD COLUMN city VARCHAR(20),
ADD COLUMN state CHAR(2);

ALTER TABLE my_contacts
ADD COLUMN id_contact INT NOT NULL AUTO_INCREMENT FIRST, 
ADD PRIMARY KEY(id_contact);

e então criei a tabela jobs:

CREATE TABLE jobs
(
  id_job INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  profession VARCHAR(20)
) AS
  SELECT profession FROM my_contacts
  GROUP BY profession
  ORDER BY profession;

Os scripts de criação seguem abaixo:

my_contacts | CREATE TABLE `my_contacts` (
 `id_contact` int(11) NOT NULL AUTO_INCREMENT,
 `last_name` varchar(30) DEFAULT NULL,
 `first_name` varchar(20) DEFAULT NULL,
 `email` varchar(50) DEFAULT NULL,
 `gender` char(1) DEFAULT NULL,
 `birthday` date DEFAULT NULL,
 `profession` varchar(50) DEFAULT NULL,
 `location` varchar(50) DEFAULT NULL,
 `status` varchar(20) DEFAULT NULL,
 `interests` varchar(100) DEFAULT NULL,
 `seeking` varchar(100) DEFAULT NULL,
 `city` varchar(20) DEFAULT NULL,
 `state` char(2) DEFAULT NULL,
 PRIMARY KEY (`id_contact`)
 ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 |
jobs  | CREATE TABLE `jobs` (
 `id_job` int(11) NOT NULL AUTO_INCREMENT,
 `profession` varchar(20) DEFAULT NULL,
 PRIMARY KEY (`id_job`)
 ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 |
R

Vc consegue exportar o scrip dessas 2 tabelas pelo mysql? Eu quero ver como o mysql criou suas tabelas.

Executando esse script que vc postou, eu consegui criar as tabelas e criar a chave estrangeira sem problemas. Só faltou nesses scripts criar o id_job em my_contacts antes de criar a chave estrangeira.

Então se puder, posta o script gerado pelo Mysql, deve ter uma opção de exportar ou algo assim.

P

Como eu faço isso? pelo PHPMyAdmin, por exemplo? eu to programando via MS - DOS. Para ser mais preciso, através do MySQL 5.1 Command Client.

R

Como eu faço isso? pelo PHPMyAdmin, por exemplo? eu to programando via MS - DOS. Para ser mais preciso, através do MySQL 5.1 Command Client.

Pelo phpAdmin vc clica no link com o nome do seu banco de dados e dai vai aparecer uma aba chamada Exportar. Clica nela, vai ir para outra tela, bem lá em baixa vai ter um botão chamado Executar, clica nele.

Vai aparecer o scprit para vc, copia e cola aqui.

Agora pelo Command Client eu não sei.

P

Eu criei um site no miarroba só que na opção de criar banco de dados no PHPMyAdmin estou sem privilégios:

Create new Databases:

No Privileges

E eu não sei como colocar privilégios. :oops:

Li algo agora sobre um programa chamado IBExpert que extrai o arquivo metadata a fim de gerar os scripts da tabela via command client. Vou tentar baixá-lo.

Edit: O IBExpert parece ser mais difícil de usar que o PHPMyAdmin.

Consegui gente. Obrigado pela atenção cedida. Fiz o seguinte (até mesmo para treinar, sei que poderia ter sido mais direto):

1º ) Criei as tabelas mas com 2 na frente para não precisar apagar a my_contacts e jobs:

mysql> CREATE TABLE my_contacts2
    -> (
    ->   id_contact INT NOT NULL AUTO_INCREMENT,
    ->   last_name varchar(30) ,
    ->   first_name varchar(20) ,
    ->   email varchar(50) ,
    ->   gender char(1),
    ->   birthday date ,
    ->   idjob INT(11) NOT NULL DEFAULT 0,
    ->   location varchar(50),
    ->   status varchar(20),
    ->   interests varchar(100),
    ->   seeking varchar(100),
    ->   city VARCHAR(20),
    ->   state CHAR(2),
    ->   PRIMARY KEY(id_contact),
    -> CONSTRAINT my_contacts2_fk FOREIGN KEY (idjob) REFERENCES jobs2 (idjob) ON DELETE CASCADE ON UPDATE CAS
CADE
    -> );
Query OK, 0 rows affected (0.02 sec)

2º ) Removi a constraint:

mysql> ALTER TABLE my_contacts2 DROP FOREIGN KEY my_contacts2_fk;
Query OK, 0 rows affected (0.06 sec)

3º) Adicionei a constraint:

mysql> ALTER TABLE my_contacts2
    -> ADD CONSTRAINT my_contacts2_fk FOREIGN KEY(idjob) REFERENCES jobs2(idjob);
Query OK, 0 rows affected (0.06 sec)

4º ) Repeti o 2º passo, removi a coluna idjob e adicionei-a logo em seguida:

mysql> ALTER TABLE my_contacts2
    -> DROP COLUMN idjob;
Query OK, 0 rows affected (0.08 sec)
mysql> ALTER TABLE my_contacts2
    -> ADD COLUMN idjob INT NOT NULL DEFAULT 0 AFTER birthday;
Query OK, 0 rows affected (0.06 sec)

5º ) Por fim, adicionei a constraint de novo e usei DESC na tabela:

mysql> ALTER TABLE my_contacts2
    -> ADD CONSTRAINT my_contacts2_fk FOREIGN KEY(idjob) REFERENCES jobs2(idjob);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC my_contacts2;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id_contact | int(11)      | NO   | PRI | NULL    | auto_increment |
| last_name  | varchar(30)  | YES  |     | NULL    |                |
| first_name | varchar(20)  | YES  |     | NULL    |                |
| email      | varchar(50)  | YES  |     | NULL    |                |
| gender     | char(1)      | YES  |     | NULL    |                |
| birthday   | date         | YES  |     | NULL    |                |
| idjob      | int(11)      | NO   | MUL | 0       |                |
| location   | varchar(50)  | YES  |     | NULL    |                |
| status     | varchar(20)  | YES  |     | NULL    |                |
| interests  | varchar(100) | YES  |     | NULL    |                |
| seeking    | varchar(100) | YES  |     | NULL    |                |
| city       | varchar(20)  | YES  |     | NULL    |                |
| state      | char(2)      | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
13 rows in set (0.00 sec)
Criado 7 de agosto de 2010
Ultima resposta 10 de ago. de 2010
Respostas 9
Participantes 3