Jump to content

Erro na FOREGIN KEY


Pedro Paiva

Recommended Posts

Pedro Paiva

Olá eu estou a tentar criar uma base de dados com uma ligação simples mas não sei o motivo de a ligação não estar a funcionar

CREATE TABLE fatura(
id_fatura INT NOT NULL AUTO_INCREMENT,
nome_empresa CHAR(50),
NIB_empresa CHAR(24),
data DATE,
nome_cliente CHAR(100),
contribuinte int(9),
email CHAR(100),
precofinal FLOAT,
precosemiva FLOAT,
precodoiva FLOAT,
troco FLOAT,
mesa INT,
PRIMARY KEY (id_fatura));


CREATE TABLE mesas(
mesa INT,
quantidade INT,
descricao CHAR(100),
preco FLOAT, 
IVA CHAR(3));
-- FOREIGN KEY (mesa) REFERENCES fatura (mesa));

Estas são as tabelas que tenho e na tabela mesa está comentada a ligação que quero fazer, mas por algum motivo não funciona, desde já gradeço a ajuda.

Link to post
Share on other sites

O teu modelo está ao contrário, é a tua fatura que tem de ter uma chave estrangeira para a mesa e não o contrário.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to post
Share on other sites
Pedro Paiva
1 hora atrás, M6 disse:

O teu modelo está ao contrário, é a tua fatura que tem de ter uma chave estrangeira para a mesa e não o contrário.

Ok isso funcionou, vou deixar a solução na citação da sua resposta, muito obrigado

CREATE TABLE mesas(
mesa INT,
quantidade INT,
descricao CHAR(100),
preco FLOAT, 
IVA CHAR(3),
PRIMARY KEY (mesa));

CREATE TABLE fatura(
id_fatura INT NOT NULL AUTO_INCREMENT,
nome_empresa CHAR(50),
NIB_empresa CHAR(24),
data DATE,
nome_cliente CHAR(100),
contribuinte int(9),
email CHAR(100),
precofinal FLOAT,
precosemiva FLOAT,
precodoiva FLOAT,
troco FLOAT,
mesa INT,
PRIMARY KEY (id_fatura),
FOREIGN KEY (mesa) REFERENCES mesas (mesa));

 

Link to post
Share on other sites

Antes de criares as tabelas devias ter um desenho lógico do sistema, isso permite, de entre outras coisas, compreender as relações e evitar situações dessas.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to post
Share on other sites
Pedro Paiva
19 minutos atrás, M6 disse:

Antes de criares as tabelas devias ter um desenho lógico do sistema, isso permite, de entre outras coisas, compreender as relações e evitar situações dessas.

Mas porque razão não funciona a tal ligação que tentei fazer

Eu normalmente faço uma normalização primeiro, mas este foi um caso em excessão

Link to post
Share on other sites

Basicamente a tua relação estava mal definida.
Lê o tema de capa da 5ª edição da da nossa revista para perceberes melhor: https://www.revista-programar.info/static/downloads/download.php?t=site&e=5

De tiveres mais dúvidas, diz.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to post
Share on other sites
Pedro Paiva

Ok agora tenho um problema, para fazer aquilo que tenho no meu caso tive que por o campo mesa como primário, só que eu tenho esta base de dados ligada a um programa em C# e a partir desse programa eu adiciono vários objetos com a mesma chave e assim não funciona 

Eu consigo fazer a ligação sem ter algum campo como primário?

Link to post
Share on other sites
Cerzedelo
10 horas atrás, Pedro Paiva disse:

Ok agora tenho um problema, para fazer aquilo que tenho no meu caso tive que por o campo mesa como primário, só que eu tenho esta base de dados ligada a um programa em C# e a partir desse programa eu adiciono vários objetos com a mesma chave e assim não funciona 

Eu consigo fazer a ligação sem ter algum campo como primário?

Sim consegue fazer a ligação sem ter nenhum campo com chave primária. Quando diz que adiciona objectos com a mesma chave e não funciona, significa que os mesmos não aparecem na base de dados ou surge algum erro?

Agora se na tabela mesa for inserir com o mesmo número mais do que uma mesa vai dar erro, porque este campo tem o chave primária, o que faz sentido cada mesa terá um só número ou referência.

Na tabela factura ao inserir dados no campo mesa faz sentido que seja criada uma condição para que esse valor já esteja previamente definido na tabela mesa

Link to post
Share on other sites
Pedro Paiva

Eu tenho uma espécie nfe caixa registadora e quero adicionar vários produtos por mesa, mas se fizer a ligação com a chave primária não funciona, como e que posso fazer a ligação sem ter a mesa como chave primária

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
×
×
  • 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.