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).

Foi útil?

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)
);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top