Como usar chaves estrangeira sem o LAST_INSERT_ID() em mysql?

5 respostas
A

Alo pessoal blz?

Eu estou a desenvolver um trabalho de fim do curso quera sobre denselvovimento de um FORUM no entanto estou com algumas dificuldades sobre Chaves estrangeira.
Quando um usuario quer criar um novo topico, tem que inserir o Assunto e o Corpo da Mensagem como no GUJ por exemplo, entao eu criei duas tabelas direi aqui que sao Assunto e Mensagem.
A tabela assunto e onde vai armazenar os assunto do forum com um assunto_id e a tabela Mensagem e onde vai armazenar as mensagens do assunto com id_mensagem e assunto_id como chave estrangeira para identificar que certas mensagens pertecem a um determinado assunto.
Eu gostaria que quando o utilizador estiver a criar um novo topico, logo que enviar o topico, o sistema gravar o Assunto na tabela do assunto e a mensagem na tabela mensagem com o id do assunto.

Andei pesquisando uns exemplo na google e encontrei isso:

[/code]CREATE TABLE person (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name CHAR(60) NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE shirt (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
colour ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
PRIMARY KEY (id)
);

INSERT INTO person VALUES (NULL, 'Antonio Paz');

INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', LAST_INSERT_ID()),
(NULL, 'dress', 'white', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());

INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');

INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', LAST_INSERT_ID()),
(NULL, 'polo', 'red', LAST_INSERT_ID()),
(NULL, 'dress', 'blue', LAST_INSERT_ID()),
(NULL, 't-shirt', 'white', LAST_INSERT_ID());

SELECT * FROM person;
+----+---------------------+
| id | name |
+----+---------------------+
| 1 | Antonio Paz |
| 2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style | colour | owner |
+----+---------+--------+-------+
| 1 | polo | blue | 1 |
| 2 | dress | white | 1 |
| 3 | t-shirt | blue | 1 |
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
| 7 | t-shirt | white | 2 |
+----+---------+--------+-------+

SELECT s.* FROM person p, shirt s
WHERE p.name LIKE 'Lilliana%'
AND s.owner = p.id
AND s.colour <> 'white';

+----+-------+--------+-------+
| id | style | colour | owner |
+----+-------+--------+-------+
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
+----+-------+--------+-------+[code]

Para o meu sistem o exemplo acima nao server porque esta usar o last_insert_id(). Uma vez que serao varios usuarios a aceder o banco de dados pode haver concorrencia ou seja dar o caso que o last_insert_id() nao pertencer ao usuario que enviou a duvida.
Ajudem!!!

valeu

5 Respostas

G

crie uma procedure que faz isso ae (utilizar o last_id inserido), pois na procedure contendo controle de transação o banco não irá se perder e inserir errado.

A

Valeu cara… Vou tentar pesquisar um sobre os procedure e dai posto um feedback

Abracos

A

Ai cara, fui dar um busca pela google sobre os procedures… Nao encontrei algo que explique claramente como usar. Se nao for pedir demais podes me dar um exemplo de como eu crio um procedure para responder a minha duvida.

valew…

G

cara, estou em casa agora e aqui não tenho muitos projetos que usem procedures, mas achei uma aqui da época da faculdade, não sei de qual versão do MySQL que ela é e que irá funcionar, talvez precise adaptar algo, mas ela faz o que você precisa.

DELIMITER $$

DROP PROCEDURE IF EXISTS aluno_inserir $$
CREATE PROCEDURE aluno_inserir (IN nome      VARCHAR(255),
                                IN telefone1 VARCHAR(18),
                                IN telefone2 VARCHAR(18),
                                IN endereco  VARCHAR(255),
                                IN bairro    VARCHAR(255),
                                IN cep       VARCHAR(9),
                                IN email     VARCHAR(255),
                                IN cidade    INT,
                                IN rg        VARCHAR(14),
                                IN cpf       VARCHAR(18),
                                IN curso     INT,
                                IN semestre  INT,
                                IN periodo   INT
)
BEGIN

  -- Variaveis
  DECLARE codigo INT;

  -- Insiro na tabela Pessoas primeiro
  INSERT INTO pessoas(pes_codigo, pes_nome, pes_telefone1,
                      pes_telefone2, pes_endereco, pes_bairro,
                      pes_cep, pes_email, cid_codigo)
               VALUES(null, nome, telefone1,
                      telefone2, endereco, bairro,
                      cep, email, cidade);

  -- atribuo o codigo ao ultimo valor inserido (q é a PK de pessoas)
  SELECT @@identity INTO codigo;

  -- Insiro na tabela de Pessoas Físicas
  INSERT INTO pessoas_fisicas(pes_codigo, pes_rg, pes_cpf)
                       VALUES(codigo, rg, cpf);

  -- Insiro na tabela de Alunos
  INSERT INTO alunos(pes_codigo, cur_codigo, sem_codigo, per_codigo)
             VALUES (codigo, curso, semestre, periodo);
END
$$ DELIMITER ;
A

Vou tentar adaptar para o meu objectivo.

Valeu brother…

Criado 27 de junho de 2011
Ultima resposta 30 de jun. de 2011
Respostas 5
Participantes 2