Jump to content
Sign in to follow this  
Carlos Rocha

Foreign Keys MySQL

Recommended Posts

Carlos Rocha

Tenho a estrutura abaixo e estou tentando adicionar Chave estrangeira conforme exemplos da Web e não consigo.

A versão que uso do MySQL é 6.0

Aonde esta o erro?

create table if not exists especificacao
(
 id int(2) unsigned not null auto_increment,
 nome varchar(50) not null,
 primary key(id)
)ENGINE = InnoDB;

create table if not exists cotacoes
(
 id int(4) unsigned not null auto_increment,
 especificacao int(2) not null,
 nome varchar(50) not null,
 email varchar(50) not null,
 telefone varchar (11) not null,
 dataEntrada date not null,
 dataSaida date not null,
 retorno char(1) not null,
 primary key(id)
 FOREIGN KEY (especificacao) 
 REFERENCES especificacao(id)
 ON DELETE CASCADE
 ON UPDATE CASCADE
)ENGINE = InnoDB;

Share this post


Link to post
Share on other sites
Carlos Rocha

Comando SQL:

CREATE TABLE IF NOT EXISTS cotacoes(
id INT( 4 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
especificacao INT( 2 ) NOT NULL ,
nome VARCHAR( 50 ) NOT NULL ,
email VARCHAR( 50 ) NOT NULL ,
telefone VARCHAR( 11 ) NOT NULL ,
dataEntrada DATE NOT NULL ,
dataSaida DATE NOT NULL ,
retornoCHAR( 1 ) NOT NULL ,
PRIMARY KEY ( id ) FOREIGN KEY ( especificacao ) REFERENCES especificacao( id ) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = INNODB;

Mensagens do MySQL :

#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 'FOREIGN KEY (especificacao)

REFERENCES especificacao(id)

ON DELETE CASCAD' at line 12

Isso sem virgula depois de primary key.

Adicionando a virgula, o erro muda para:

#1005 - Can't create table 'cotacoes.cotacoes' (errno: 150) (Details…)

Edited by Rui Carlos
Formatação corrigida.

Share this post


Link to post
Share on other sites
HappyHippyHippo

experimentaste carregar no link "details" ? dava jeito saber mais informação do que a que apresentas aqui


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

Share this post


Link to post
Share on other sites
Carlos Rocha

InnoDB

Supports transactions, row-level locking, and foreign keys

[ Variáveis | Buffer Pool | Estado da InnoDB ]

Variaveis:

InnoDB

Supports transactions, row-level locking, and foreign keys

[ Variáveis | Buffer Pool | Estado da InnoDB ]

InnoDB é o storage engine por defeito neste MySQL server. innodb_adaptive_hash_index ON innodb_additional_mem_pool_size 2,048 KB Autoextend increment 8 innodb_autoinc_lock_mode 1 Buffer pool size 78,848 KB innodb_checksums ON innodb_commit_concurrency 0 innodb_concurrency_tickets 500 Data files ibdata1:10M:autoextend Data home directory innodb_doublewrite ON innodb_fast_shutdown 1 innodb_file_io_threads 4 innodb_file_per_table OFF innodb_flush_log_at_trx_commit 1 innodb_flush_method innodb_force_recovery 0 innodb_lock_wait_timeout 50 innodb_locks_unsafe_for_binlog OFF innodb_log_buffer_size 1,024 KB innodb_log_file_size 39,936 KB innodb_log_files_in_group 2 innodb_log_group_home_dir .\ innodb_max_dirty_pages_pct 90 innodb_max_purge_lag 0 innodb_mirrored_log_groups 1 innodb_open_files 300 innodb_rollback_on_timeout OFF innodb_stats_on_metadata ON innodb_support_xa ON innodb_sync_spin_loops 20 innodb_table_locks ON innodb_thread_concurrency 8 innodb_thread_sleep_delay 10 k

Buffer:

InnoDB

Supports transactions, row-level locking, and foreign keys

[ Variáveis | Buffer Pool | Estado da InnoDB ] Buffer Pool Usage Total : 4,928 pages / 78,848 KB Free pages 4,789 Dirty pages 0 Pages containing data 138 Pages to be flushed 422 Busy pages 1 Buffer Pool Activity Read requests 13,832 Write requests 4,808 Read misses 30 Write waits 0 Read misses in % 216.89 m % Write waits in % 0 %

Share this post


Link to post
Share on other sites
HappyHippyHippo
create table if not exists especificacao
(
 id int primary key auto_increment,
 nome varchar(50) not null
)ENGINE = InnoDB;

create table if not exists cotacoes
(
 id int primary key auto_increment,
 especificacao int not null,
 nome varchar(50) not null,
 email varchar(50) not null,
 telefone varchar (11) not null,
 dataEntrada date not null,
 dataSaida date not null,
 retorno char(1) not null,
 FOREIGN KEY (especificacao) 
 REFERENCES especificacao(id)
 ON DELETE CASCADE
 ON UPDATE CASCADE
)ENGINE = InnoDB;


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

Share this post


Link to post
Share on other sites
Carlos Rocha

Duvidas:

1) Por que não posso usar ...PRIMARY KEY(id).. lá no final antes de FOREIGN KEY?

2) Por que não posso usar unsigned para informar que a chave é unica?

Edited by carcleo

Share this post


Link to post
Share on other sites
Knitter

Aonde esta o erro?

Tens especificações diferentes para as chave e para o campo referenciado, um é UNSIGNED o outro não, têm de ter sempre a mesma especificação.

1) Por que não posso usar ...PRIMARY KEY(id).. lá no final antes de FOREIGN KEY?

Porque te falta uma vírgula a separar os campos, como diz no erro.

2) Por que não posso usar unsigned para informar que a chave é unica?

Como disse que disse?! UNSIGNED significa que os valores serão sem sinal, sempre positivos.

...
id int(2) unsigned not null auto_increment,
...

Esta especificação não tem muito sentido, confirma a documentação do MySQL e lê a explicação do que significa colocar o número de casas visíveis num campo numérico.

  • Vote 1

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.