Como criar relações no MySQL
-
06-07-2019 - |
Pergunta
Em classe, somos todos 'estudando' bancos de dados, e todo mundo está usando Access. Entediado com isso, eu estou tentando fazer o que o resto da classe está fazendo, mas com comandos SQL crus com MySQL em vez de usar Access.
Eu consegui criar bancos de dados e tabelas, mas agora como faço para fazer uma relação entre duas tabelas?
Se eu tiver as minhas duas tabelas como este:
CREATE TABLE accounts(
account_id INT NOT NULL AUTO_INCREMENT,
customer_id INT( 4 ) NOT NULL ,
account_type ENUM( 'savings', 'credit' ) NOT NULL,
balance FLOAT( 9 ) NOT NULL,
PRIMARY KEY ( account_id )
)
e
CREATE TABLE customers(
customer_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
address VARCHAR(20) NOT NULL,
city VARCHAR(20) NOT NULL,
state VARCHAR(20) NOT NULL,
PRIMARY KEY ( customer_id )
)
Como faço para criar um 'relacionamento' entre as duas tabelas? Eu quero que cada conta a ser 'atribuído' um customer_id (para indicar quem é o dono).
Solução
Se as tabelas são InnoDB pode criá-lo como este:
CREATE TABLE accounts(
account_id INT NOT NULL AUTO_INCREMENT,
customer_id INT( 4 ) NOT NULL ,
account_type ENUM( 'savings', 'credit' ) NOT NULL,
balance FLOAT( 9 ) NOT NULL,
PRIMARY KEY ( account_id ),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
) ENGINE=INNODB;
Você tem que especificar que as tabelas são InnoDB porque o motor myisam não suporta chave estrangeira. Olhe aqui para mais informações.
Outras dicas
como ehogue disse, colocar isso em seu CREATE TABLE
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
Como alternativa, se você já tem a tabela criada, use um comando ALTER TABLE:
ALTER TABLE `accounts`
ADD CONSTRAINT `FK_myKey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON DELETE CASCADE ON UPDATE CASCADE;
Uma boa maneira de começar a aprender esses comandos está usando as ferramentas MySQL GUI , que lhe dão uma interface mais "visual" para trabalhar com seu banco de dados. O benefício real para que (sobre o método de acesso), é que depois de projetar sua mesa através do GUI, mostra-lhe o SQL que vai correr, e, portanto, você pode aprender com isso.
CREATE TABLE accounts(
account_id INT NOT NULL AUTO_INCREMENT,
customer_id INT( 4 ) NOT NULL ,
account_type ENUM( 'savings', 'credit' ) NOT NULL,
balance FLOAT( 9 ) NOT NULL,
PRIMARY KEY ( account_id )
)
and
CREATE TABLE customers(
customer_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
address VARCHAR(20) NOT NULL,
city VARCHAR(20) NOT NULL,
state VARCHAR(20) NOT NULL,
)
How do I create a 'relationship' between the two tables? I want each account to be 'assigned' one customer_id (to indicate who owns it).
Você tem que se perguntar é este um 1 a 1 relacionamento ou um 1 de muitos relação. Ou seja, faz cada conta tem um cliente e cada cliente tem uma conta. Ou haverá clientes sem contas. Sua pergunta implica o último.
Se você quiser ter uma estreita relação de 1 a 1, apenas mesclar as duas tabelas.
CREATE TABLE customers(
customer_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
address VARCHAR(20) NOT NULL,
city VARCHAR(20) NOT NULL,
state VARCHAR(20) NOT NULL,
account_type ENUM( 'savings', 'credit' ) NOT NULL,
balance FLOAT( 9 ) NOT NULL,
)
No outro caso, a maneira correta de criar uma relação entre duas tabelas é criar uma tabela de relacionamento.
CREATE TABLE customersaccounts(
customer_id INT NOT NULL,
account_id INT NOT NULL,
PRIMARY KEY (customer_id, account_id)
FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
FOREIGN KEY account_id references accounts (account_id) on delete cascade
}
Então, se você tem um customer_id e quer a informação de conta, você juntar-se em customersaccounts e contas:
SELECT a.*
FROM customersaccounts ca
INNER JOIN accounts a ca.account_id=a.account_id
AND ca.customer_id=mycustomerid;
Por causa de indexar este será incrivelmente rápido.
Você também pode criar uma visão que lhe dá o efeito da mesa customersaccounts combinado, mantendo-os separados
CREATE VIEW customeraccounts AS
SELECT a.*, c.* FROM customersaccounts ca
INNER JOIN accounts a ON ca.account_id=a.account_id
INNER JOIN customers c ON ca.customer_id=c.customer_id;
Adicionando sobre o comentário de ehogue, você deve fazer o tamanho das teclas em ambos jogo tabelas. Ao invés de
customer_id INT( 4 ) NOT NULL ,
torná-lo
customer_id INT( 10 ) NOT NULL ,
e certifique-se de sua coluna int na tabela de clientes é int (10) também.
Alguns motores MySQL suportam chaves estrangeiras. Por exemplo, InnoDB pode estabelecer restrições com base em chaves estrangeiras. Se você tentar excluir uma entrada em uma tabela que tem dependentes em outro, a exclusão falhará.
Se você estiver usando um tipo de tabela no MySQL, como MyISAM, que não suporta chaves estrangeiras, você não ligar as tabelas em qualquer lugar exceto seus diagramas e consultas.
Por exemplo, em uma consulta que você ligar duas tabelas em uma instrução SELECT com uma junção:
SELECT a, b from table1 LEFT JOIN table2 USING (common_field);
Aqui está um par de recursos que irão ajudar a começar: http: // www. anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase e http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561
Além disso, como outros disseram, usar uma GUI - download tentativa e instalar Xampp (ou Wamp) que executar o servidor-software (Apache e MySQL) no seu computador. Então, quando você navegar para // localhost em um navegador, selecione phpMyAdmin para começar a trabalhar com um banco de dados mySQL visualmente. Como mencionado acima, usado innoDB para permitir que você faça relacionamentos como você pediu. Torna amontoa mais fácil ver o que está fazendo com as tabelas de banco de dados. Basta lembrar de serviços PARAR Apache e MySQL quando terminado -. Estas podem abrir portas que pode expô-lo à pirataria / ameaças maliciosas
Uma das regras que você tem que saber é que a coluna tabela que deseja referência a tem que ser com o mesmo tipo de dados como A tabela de referência. 2, se você decidir usar o MySQL você tem que usar InnoDB motor, porque de acordo com a sua pergunta que é o motor que suporta o que você deseja alcançar no mysql.
Abaixo está o código experimentar embora as primeiras pessoas a responder a esta pergunta eles 100%, desde grandes respostas e por favor considere todos eles.
CREATE TABLE accounts(
account_id INT NOT NULL AUTO_INCREMENT,
customer_id INT( 4 ) NOT NULL ,
account_type ENUM( 'savings', 'credit' ) NOT NULL,
balance FLOAT( 9 ) NOT NULL,
PRIMARY KEY (account_id)
)ENGINE=InnoDB;
CREATE TABLE customers(
customer_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
address VARCHAR(20) NOT NULL,
city VARCHAR(20) NOT NULL,
state VARCHAR(20) NOT NULL,
PRIMARY KEY ( account_id ),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
)ENGINE=InnoDB;
create table departement(
dep_id int primary key auto_increment,
dep_name varchar(100) not null,
dep_descriptin text,
dep_photo varchar(100) not null,
dep_video varchar(300) not null
);
create table newsfeeds(
news_id int primary key auto_increment,
news_title varchar(200) not null,
news_description text,
news_photo varchar(300) ,
news_date varchar(30) not null,
news_video varchar(300),
news_comment varchar(200),
news_departement int foreign key(dep_id) references departement(dep_id)
);