Cómo crear relaciones en MySQL


En clase, todos estamos 'estudiando' bases de datos, y todo el mundo está usando Access. Aburrido de esto, estoy tratando de hacer lo que el resto de la clase está haciendo, pero con comandos SQL sin procesar con MySQL en lugar de usar Access.

He logrado crear bases de datos y tablas, pero ahora ¿cómo hago una relación entre dos tablas?

Si tengo mis dos tablas como esta:

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

Y

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

¿Cómo puedo crear una "relación" entre las dos tablas? Quiero que cada cuenta ser 'asignado' un customer_id (para indicar quién lo posee).

Author: aneroid, 2008-11-04

8 answers

Si las tablas son innodb puedes crearlas así:

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;

Debe especificar que las tablas son innodb porque el motor de myisam no admite la clave foránea. Mira aquí para más información.

 86
Author: Eric Hogue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-04 00:32:48

Como dijo ehogue, pon esto en tu TABLA DE CREACIÓN

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

Alternativamente, si ya tiene la tabla creada, use un comando ALTER TABLE:

ALTER TABLE `accounts`
  ADD CONSTRAINT `FK_myKey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON DELETE CASCADE ON UPDATE CASCADE;

Una buena manera de empezar a aprender estos comandos es usando las herramientas MySQL GUI, que le dan una interfaz más "visual" para trabajar con su base de datos. El beneficio real de eso (sobre el método de Access), es que después de diseñar su tabla a través de la GUI, le muestra el SQL que va a ejecutar, y por lo tanto puede aprender de que.

 68
Author: nickf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-04 00:37:52
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).

Tienes que preguntarte si esta es una relación de 1 a 1 o un 1 de muchas relaciones. Es decir, ¿cada cuenta tiene un cliente, y cada cliente tiene una cuenta. O habrá clientes sin cuentas. Su pregunta implica lo último.

Si desea tener una relación estricta de 1 a 1, simplemente combine las dos tablas.

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

En otro caso, la forma correcta de crear una relación entre dos tablas es crear una relación tabla.

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
}

Entonces, si tiene un customer_id y desea la información de la cuenta, se une a customersaccounts y accounts:

SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;

Debido a la indexación esto será cegadoramente rápido.

También puede crear una VISTA que le proporcione el efecto de la tabla customersaccounts combinada mientras las mantiene separadas

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;
 11
Author: user3842431,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-31 19:20:36

Añadiendo al comentario de ehogue, debe hacer que el tamaño de las teclas en ambas tablas coincida. En lugar de

customer_id INT( 4 ) NOT NULL ,

Que sea

customer_id INT( 10 ) NOT NULL ,

Y asegúrese de que su columna int en la tabla clientes es int(10) también.

 9
Author: Zak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-04 00:36:10

Ciertos motores MySQL admiten claves foráneas. Por ejemplo, InnoDB puede establecer restricciones basadas en claves foráneas. Si intenta eliminar una entrada en una tabla que tiene dependientes en otra, la eliminación fallará.

Si está utilizando un tipo de tabla en MySQL, como MyISAM, que no admite claves foráneas, no vinculará las tablas en ningún lugar excepto sus diagramas y consultas.

Por ejemplo, en una consulta vincula dos tablas en una instrucción select con una combinación:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);
 6
Author: Gary Richardson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-04 01:02:30

Aquí hay un par de recursos que le ayudarán a comenzar: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase y http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

También como otros dijeron, use una GUI - intente descargar e instalar Xampp (o Wamp) que ejecute el software de servidor (Apache y MySQL) en su computadora. Luego, cuando navegue a //localhost en un navegador, seleccione phpMyAdmin para iniciar trabajar con una base de datos MySQL visualmente. Como se mencionó anteriormente, InnoDB utilizado para permitir que usted haga las relaciones como usted solicitó. Hace que sea mucho más fácil ver lo que está haciendo con las tablas de la base de datos. Solo recuerde DETENER los servicios Apache y MySQL cuando termine - estos pueden abrir puertos que pueden exponerlo a amenazas de piratería/maliciosas.

 2
Author: user3659515,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-21 06:37:34

Una de las reglas que debe conocer es que la columna de la tabla a la que desea hacer referencia debe tener el mismo tipo de datos que La tabla de referencia . 2 si decides usar mysql tienes que usar InnoDB Engine porque según tu pregunta ese es el motor que soporta lo que quieres lograr en mysql .

A continuación está el código inténtelo aunque las primeras personas en responder a esta pregunta el 100% proporcionó excelentes respuestas y, por favor, considérelas todas .

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; 
 1
Author: Musa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-26 10:47:04
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)
);
 0
Author: Anayat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-16 05:32:11