No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de SQL y MySQL

Curso de SQL y MySQL

Alberto Alcocer (Beco)

Alberto Alcocer (Beco)

Tipos de columnas usando / Creación de la tabla clientes

10/24
Recursos

Aportes 412

Preguntas 57

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

  1. EL no colocar AUTO_INCREMENT a la columna que es PRIMARY KEY simplemente vuelve el proceso de asignar id a una forma manual o se puede asignar desde otra capa de negocios.
    UNIQUE, la columna que tenga el constraint unique garantiza que el valor que se guarda en esa columna sea único

  2. -. TIMESTAMP
    Está basado en el número epoch que es el 1 enero de 1970 hasta la fecha y es donde se determina el inicio de las computadoras y es un número entero que se guarda en segundos y permite hacer operaciones sobre el.

  3. -. DATETIME
    Este tipo de datos puede guardar cualquier valor de tipo fecha sin restricción. Incluso anterior a nuestra era. es por eso que las fechas de nacimiento de usuarios debe utilizar este valor para garantizar que podemos registrarlos con la fecha adecuada.

  4. TIMESTAMP vs DATETIME: hay que resaltar que un, 1.TIMESTAMP “NO PUEDE HACER TODO LO DE DATETIME pero DATETIME SÍ PUEDE HACERLO DE UN TIMESTAMP”, 2.DATETIME no está guardado en segundos y no es tan eficiente para hacer cálculos.

  5. -.Active
    Es buena práctica no eliminar registros de una bases de datos es por ello que se crea una columna como active que es un valor booleano dicho valor sirve para para decir si el registro está activo o no.

  6. -. created_ad y updated_ad
    Es buena práctica tener una columna que permite saber el momento exacto en el que se crea un registro o se actualiza. Este tipo de dato se comporta más como una meta-información y nos puede ayudar por ejemplo a cuántos usuarios fueron creados en una fecha en específico, saber cuando una tupla se actualizó

  7. created_ad Es una columna de buena práctica que permite saber cuando se creó un registro. Está utilizará un conjunto de propiedades llamada entre ella se colocará DEFAULT CURRENT_TIMESTAMP . Cuando se realiza un insert sí el valor de esta columna viene vacío colocará en la tupla el valor de la fecha en que se creó de manera automática .

 `created_at`    TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP,
  1. update_ad Es una columna de buena práctica que permite saber cuando un registro se actualiza se puede colocar ON UPDATE CURRENT_TIMESTAMP esto permite dejar un registro de la fecha actual cuando ocurre una actualización
`updated_at`    TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP 
                       ON UPDATE CURRENT_TIMESTAMP, 
/*Tabla clientes*/
CREATE TABLE `clients` (
  `client_id`       int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name`           varchar(50) DEFAULT NULL,
  `email`           varchar(100) NOT NULL,
  `birthdate`       date DEFAULT NULL,
  `gender` enum('M','F') DEFAULT NULL,
  `active`           TINYINT(1) NOT NULL DEFAULT 1,
 `created_at`    TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at`    TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP 
                       ON UPDATE CURRENT_TIMESTAMP, 
  PRIMARY KEY (`client_id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8;
/*Tabla transactions*/
CREATE TABLE `transactions` (
  `transaction_id`      int(10) unsigned NOT NULL AUTO_INCREMENT,
  `book_id`             int(10) unsigned NOT NULL,
  `client_id`           int(10) unsigned NOT NULL,
  `type` enum('lend','sell') NOT NULL,
  `created_at`          timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modified_at`         timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `finished`            tinyint(1) NOT NULL DEFAULT '0',
  `active`        TINYINT(1) NOT NULL DEFAULT 1,
  PRIMARY KEY (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Les recomiendo esta pagina, que sirve para hacer inspeccion del codigo.

https://www.eversql.com/sql-syntax-check-validator/

Hola amigos de platzi aquí les dejo un aporte para que aprendan a como crear un usuario,listarlo y eliminarlo sigan los pasos tal como esta en la imagen espero les sirva.

CREATE TABLE operations(
    operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    book_id INTEGER UNSIGNED NOT NULL, 
    client_id INTEGER UNSIGNED NOT NULL,
    type ENUM('V','P', 'D' ) NOT NULL COMMENT 'V: Vendido -P:Prestado -D: Devuelto',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    finished TINYINT(1) NOT NULL
    
);```

En Colombia se le suele decir a las tuplas -> registros y a las columnas -> campos.

Acá como lo “solucioné”, nota de color interesante para la Base de Datos no es lo mismo usar ( ` ) en los nombres que usar ( ’ ), lo aprendí a las malas.

CREATE TABLE `operation` (
    `operation_id` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `book_id` INT(10) unsigned NOT NULL,
    `client_id` INT(10) unsigned NOT NULL,
    `operation_type` enum('PRESTAMO', 'DEVOLUCIÓN', 'VENTA'),
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `finished` TINYINT(1) NOT NULL,
    UNIQUE KEY `operation_id` (`operation_id`)
);```
CREATE TABLE clients (
    client_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    birthdate DATETIME,
    gender ENUM('M', 'F', 'ND') NOT NULL,
    active TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
        ON UPDATE CURRENT_TIMESTAMP
    
);```

Me encanta este profe!

Ahi les dejo el significado de los tipos de datos con fecha o tiempo
Tipo Fecha
DATE : Fecha con formato AAAA-MM-DD
TIME : Hora con formato hh:mm:ss
DATETIME : Fecha y hora con formato AAAA-MM-DD hh:mm:ss
TIMESTAMP : Lapso de tiempo con formato AAAA-MM-DD-hh-mm-ss.
YEAR : Año con formato AAAA

Resumen de la clase:
Tips:
Auto Increment es una buena práctica
Siempre crear columna created_at cuando se tiene una base de datos catalogo - operación.
Ninguna tupla se borra jamás, se usa columna active con bandera booleana

Tipo de Datos:
UNIQUE: valor de llave donde el valor de la columna es único.
TIMESTAMP: basado en EPOC, guarda enteros el valor de 1970 a la fecha.
DATETIME: ideal para cunpleanos, cualquier valor, no tan eficiente al calcular.
ENUM: enumeración de datos, solo se recibe una de las opciones.

Código Reto:

CREATE TABLE IF NOT EXISTS operations (
    operation_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    book_id INT UNSIGNED,
    client_id INT UNSIGNED,
    `type` ENUM('borrowed', 'sold', 'returned') NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    finished TINYINT(1) NOT NULL
);

Algo tan simple como DATETIME y TIMESTAMP puede explicarse con un esquema de forma muy simple, no hay necesidad de tanta palabrería.


CREATE TABLE IF NOT EXISTS authors (
    author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    nationality VARCHAR(3)
);

//MOSTRAR LAS COLUMNAS DE LAS tablas
describe authors; 
desc books;
// MOSTRAR COMENTARIOS
show full comuns from books

//nombre de una columa y reservarla con comillas `integer_column `
`year`

CREATE TABLE clients(
    id_client INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    birthdate DATETIME,
    gender ENUM('M','F', 'ND') NOT NULL,
    
    active TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
********NOTA*************
DATETIME cualquier fecha como 1800-01-01 00:00:00
TIMESTAMP es un valor desde 1970 hasta ahora, global. Para calculos ('yyyy-mm-dd hh:mm:ss')
The DATETIME type is used when you need values that contain both date and time information. MySQL 
retrieves 
and displays DATETIME values in 'YYYY-MM-DD HH:MM:SS' format. The supported range is 
'1000-01-01 00:00:00' to '9999-12-31 23:59:59'.


The TIMESTAMP data type has a range of '1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07' UTC. 
It has varying properties, depending on the MySQL version and the SQL mode the server is running in.
...
ENUM ( '','','') 
An ENUM is a string object with a value chosen from a list of permitted values 
that are enumerated explicitly in the column specification at table creation time.
********END NOTA**********```

Profe no todos los estudiantes son de despues de los 70

created_ad y updated_ad
Es buena práctica tener una columna que permite saber el momento exacto en el que se crea un registro o se actualiza. Este tipo de dato se comporta más como una meta-información y nos puede ayudar por ejemplo a cuántos usuarios fueron creados en una fecha en específico, saber cuando una tupla se actualizó

CREATE TABLE IF NOT EXISTS operations (
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	book_id INTEGER UNSIGNED,
	client_id INTEGER UNSIGNED,
	type ENUM("Vendido", "Prestado", "Devuelto"),
	created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
	ON UPDATE CURRENT_TIMESTAMP,
	finshed TINYINT(1) NOT NULL DEFAULT 1
	);



CREATE TABLE IF NOT EXISTS operations (
`operation_id` INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
`books_id` INTEGER UNSIGNED,
`client_id` INTEGER UNSIGNED,
`type` ENUM ('Disponible', 'Prestamo', 'Vendido', 'Devuelto' ),
`created_at` TIMESTAMP NOT NULL  DEFAULT CURRENT_TIMESTAMP,
`upadte_at`  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE  CURRENT_TIMESTAMP,
`finished` TINYINT (1) NOT NULL
);

Buen Día

Quisiera saber a que se debe este error…

mysql> CREATE TABLE clients (
-> client_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(50) NOT NULL,
-> email VARCHAR(100) NOT NULL UNIQUE,
-> birthdate DATETIME,
-> gender ENUM(‘M’, ‘F’, ‘ND’) NOT NULL,
-> active TINYINT(1) NOT NULL DEFAULT 1,
-> created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-> updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
-> ON UPDATE CURRENT_TIMESTAMP
-> );
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
mysql>

Según veo la sintaxis es la misma que usa el profesor y no creo que el sistema operativo ponga problemas estoy usando un Windows 10, debo hacer alguna conf adicional.

Quedo atento.

Dato curioso: El Timestamp llega hasta 2038-01-19 03:14:07 porque hasta ahí llega el contador de ((2^31) - 1) bits que tienen los sistemas de 32 bits.

Todos los programas que usen esta medida de 32 bits de tiempo volverán (Informáticamente) al año 1900, cosa que posiblemente cause muchos problemas si no se previene antes de esa fecha.

El nombre que se le dio a este problema es Y2K38 (Year 2038), aunque también hay unos muy parecidos llamados Y2K36 y Y2K que siguen la misma lógica.

Reto cumplido!

![](

Tupla: En resumen, en el contexto de MySQL y bases de datos en general, una tupla es una fila en una tabla que contiene un conjunto de valores relacionados con las columnas de esa tabla.

¿Es necesario colocar el auto_increment?

La respuesta es no, pero es útil para poder llevar un mejor control en la DB sin ocasionar problemas, a diferencia de que si agregamos el id manualmente, el usuario podría olvidarse que agrego ya el id 1 hace años y volverlo a colocar. Esto generaría complicaciones

```js USE biblioteca; CREATE TABLE clients ( client_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, birthdate DATETIME, gender ENUM('M', 'F', 'ND') NOT NULL, active TINYINT(1) NOT NULL DEFAULT 1, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Se agrega "ON UPDATE CURRENT_TIMESTAMP" para actualizar automáticamente el campo `updated_at` ) ```Esta bien colocarle create\_at y update\_at a todas las tablas? pregunto porque el profe del curso anterior lo recomendó.

Veo que algunos permiten null en book_id y client_id, lo que no es viable porque a ninguna operación le puede faltar el libro y cliente correspondientes.

CREATE TABLE IF NOT EXISTS operations (
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	book_id INTEGER UNSIGNED NOT NULL,
	client_id INTEGER UNSIGNED NOT NULL,
	`type` ENUM('P', 'D', 'V') NOT NULL, 
	created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
		ON UPDATE CURRENT_TIMESTAMP,
	finished TINYINT(1) NOT NULL
);

este es el código para la tabla clients:

create table clients (
    `client_id` integer unsigned primary key auto_increment,
    `name` varchar(50) not null,
    `email` varchar(100) not null unique,
    `birthdate` datetime,
    `gender` enum('M', 'F', 'ND') not null,
    `active` tinyint(1) not null default 1,
    `created_at` timestamp not null default current_timestamp,
    `updated_at` timestamp not null default current_timestamp on update current_timestamp
); 

esta es mi propuesta para la tabla operations:

create table if not exists operations (
    `operation_id` integer unsigned primary key auto_increment,
    `book_id` integer unsigned,
    `client_id` integer unsigned,
    `type` enum('s', 'b', 'r') not null,
    `finished` tinyint(1) not null,
    `created_at` timestamp not null default current_timestamp,
    `updated_at` timestamp not null default current_timestamp on update current_timestamp
); 

CREATE TABLE clients (
-> client_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(50) NOT NULL,
-> email VARCHAR(100) NOT NULL UNIQUE,
-> birthdate DATETIME,
-> gender ENUM( ‘M’ , ‘F’ , ‘ND’) NOT NULL,
-> active TINYINT(1) NOT NULL DEFAULT 1,
-> created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-> updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.33 sec)

Aqui ta uwu:

CREATE TABLE IF NOT EXISTS operations(
    
    `operation_id` INTEGER UNSIGNED NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
    `book_id` INTEGER UNSIGNED NOT NULL,
    `client_id` INTEGER UNSIGNED NOT NULL,
    `type` ENUM('Prestado', 'Vendido', 'Devuelto') NOT NULL,
    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `update_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `finished` TINYINT NOT NULL,

    FOREIGN KEY(`book_id`) REFERENCES books(`book_id`),
    FOREIGN KEY(`client_id`) REFERENCES clients(`client_id`)
    
);

Como utilizo mariaDB puede ser mínimamente diferente pero es mas de los mismo al final c:

<
 CREATE TABLE IF NOT EXISTS operations(
     `operation_id` INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
     `book_id` INTEGER UNSIGNED,
     `client_id` INTEGER UNSIGNED,
     `type`ENUM('L', 'R', 'S') NOT NULL COMMENT 'L = lent, R = returned, S = Sold',
     `finished` SMALLINT(1), 
     `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(),
     `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP()
 );
>

Reto completado 😄

CREATE TABLE IF NOT EXISTS operations (
    operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    book_id INTEGER UNSIGNED, 
    client_id INTEGER UNSIGNED,
    type ENUM('SELLED', 'BORROWED', 'RETURNED') NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    finished TINYINT(1) NOT NULL DEFAULT '0'
);
CREATE TABLE IF NOT EXISTS operations(
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	book_id INTEGER UNSIGNED NOT NULL,
	client_id INTEGER UNSIGNED NOT NULL
	operation ENUM("V","P","D") UNSIGNED,
	created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	finished TINYINT(1) NOT NULL
);

Les dejo un cuadro de los tipos de Datos de fecha y hora

updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finshed TINYINT(1) NOT NULL

Existe algo así en SQL Servers? Esto es INCREÍBLE!!

CREATE TABLE IF NOT EXISTS operations (
operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
book_id INTEGER UNSIGNED,
client_id INTEGER UNSIGNED,
type ENUM(‘P’,‘D’,‘V’),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
finshed TINYINT(1) NOT NULL

Buen día, esta es mi propuesta para generar la tabla de operations:

CREATE TABLE IF NOT EXISTS operations(
    operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    book_id INTEGER UNSIGNED NOT NULL,
    client_id INTEGER UNSIGNED NOT NULL,
    type ENUM('B','R','S') NOT NULL COMMENT 'Borrowed, Returned, Sold',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    finished TINYINT(1) NOT NULL
);
CREATE TABLE IF NOT EXISTS operations (
  operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  book_id INTEGER UNSIGNED,
  client_id INTEGER UNSIGNED,
  type ENUM('PRESTADO', 'DEVUELTO', 'VENDIDO') NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    ON UPDATE CURRENT_TIMESTAMP,
  finshed TINYINT(1) NOT NULL
);

Mi tabla quedó de la siguiente forma.

<CREATE TABLE IF NOT EXISTS operations (
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	book_id INTEGER UNSIGNED,
	client_id INTEGER UNSIGNED,
	type ENUM('PRESTADO', 'DEVUELTO', 'VENDIDO'),
	create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	finshed TINYINT(1) NOT NULL
	);>

Yo lo dejé así:

CREATE TABLE IF NOT EXISTS operations(
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	book_id INTEGER UNSIGNED,
	client_id INTEGER UNSIGNED,
	op_type ENUM('VTA', 'PRE', 'DEV') NOT NULL DEFAULT 'VTA',
	created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	finished TINYINT(1) NOT NULL DEFAULT(0)
);

Así quedó la tabla:

CREATE TABLE IF NOT EXISTS operations (
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  	book_id INTEGER UNSIGNED NOT NULL,
  	client_id INTEGER UNSIGNED NOT NULL,
	type ENUM("borrowed","returned","sold") NOT NULL,
  	created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  	updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  	finished TINYINT(1) NOT NULL
); ```

Hay dos tipos de datos de DATE:

  • DATETIME: no tiene restricciones a la hora de indicar cualquier año de cualquier fecha.
  • TIMESTAMP: esta basada en el número epoch, número de segundos desde 1 de Enero de 1970.

LO HICE ASI PERO ME DA ERROR, ME CORRIGEN

CREATE TABLA IF NOT EXISTS operations (
operation_id INTEGER UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
book_id INTEGER UNSIGNED NOT NULL,
cliente_id INTEGER UNSIGNED NOT NULL,
typy ENUM(‘prestado’, ‘devuelto’, ‘vendido’),
create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finshed TYNYINT (1) NOT NULL DEFAULT
);

created_ad y updated_ad, Este tipo de dato se comporta más como una meta-información y nos puede ayudar por ejemplo a cuántos usuarios fueron creados en una fecha en específico o en qué fecha los datos de los usuarios fueron actualizados.

CREATE TABLE IF NOT EXISTS operations(
   operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    book_id INTEGER UNSIGNED,
    client_id INTEGER UNSIGNED,
    `type` ENUM('prestado','devuelto','vendido') NOT NULL,
    create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 	CURRENT_TIMESTAMP,
    finshed TINYINT(1) NOT NULL
);

Gracias por aceptarme.Yo nací antes de 1970 y antes de los 60.Sesgado el curso? o el conocimiento?

No conocía la diferencia entre TIMESTAMP y DATETIME ahora la tendré en cuenta a la hora de crear tablas.gracias 😃

creacion de tabla operations

CREATE TABLE IF NOT EXISTS operations(
  operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  book_id INTEGER UNSIGNED NOT NULL,
  client_id INTEGER UNSIGNED NOT NULL,
  `type` ENUM('Lend','Return','Sell') NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  finshed TINYINT(1) NOT NULL DEFAULT '0',
);```
CREATE TABLE IF NOT EXISTS operations (
    operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    book_id INTEGER UNSIGNED,
    client_id INTEGER UNSIGNED,
    type ENUM('prestado','devuelto','vendido') NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    ON UPDATE CURRENT_TIMESTAMP,
    finished TINYINT(1) NOT NULL DEFAULT 0
);```

En active utilice el tipo de dato boolean.

CREATE TABLE `clients` (
  `client_id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL,
  `email` VARCHAR(100) NOT NULL UNIQUE,
  `birthdate` DATETIME,
  `gender` ENUM('M', 'F', 'ND') NOT NULL,
  `active` BOOLEAN DEFAULT true,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);```
CREATE TABLE `opeations` (
  `opeartion_id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  `book_id` INT UNSIGNED,
  `user_id` INT UNSIGNED,
  `type` ENUM('borrowed', 'sold', 'returned') NOT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `finished` TINYINT(1) NOT NULL DEFAULT 0
);```

el curso va excelente pero tengo un problema yo estoy haciendo el proceso con SQL server pero tengo un problema con el Columna **Update_at ** tabla **operations **no he podido crear esta tabla esta esta parte ya sql creo que es diferente agredesco si alguien sabe como se maneja esta parte en SQL server.

CREATE TABLE operations ( 
operation_id INT(10) unsigned PRIMARY KEY AUTO_INCREMENT,
book_id INT(10) unsigned NOT NULL,
client_id INT(10) unsigned NOT NULL,
type ENUM('prestado','devuelto','vendido') NOT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finished tinyint(1) NOT NULL DEFAULT 0);```

Me gusta los trucos que dá el profe, enserio es un buen masestro, aqí dejo el reto, no es complicado todo ya lo vimos y me queda claro

CREATE TABLE IF NOT EXISTS operations(
    operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    book_id INTEGER UNSIGNED, 
    client_id INTEGER UNSIGNED, 
    `type` ENUM('PRESTADO', 'DEVUELTO', 'VENDIDO') NOT NULL, 
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    finshed TINYINT(1) NOT NULL DEFAULT 0
);

en mi caso siempre me acostumbre a crear los campos de las tablas con el prefijo del nombre de la tabla ejemplo:
authors_name porque asi me evito siempre el no usar palabras reservadas o que puedan repetirse en otras tablas y cuando haces un select de varias tablas se de que tabla es que campo.

CREATE TABLE IF NOT EXISTS author(
    idAuthor INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    national VARCHAR(3)
);

CREATE TABLE IF NOT EXISTS book(
    idBook INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    idAuthor INTEGER,
    title VARCHAR(100) NOT NULL,
    year INTEGER UNSIGNED NOT NULL DEFAULT 0,
    language varchar(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 language',
    cover_url VARCHAR(500),
    price DOUBLE(6,2) NOT NULL DEFAULT 10.0,
    sellable TINYINT(1) DEFAULT 1,
    copies INTEGER NOT NULL DEFAULT 1,
    description TEXT
);

CREATE TABLE IF NOT EXISTS client(
    idClient INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(5) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    birthdate DATETIME,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    active TINYINT(1) NOT NULL DEFAULT 1
);

CREATE TABLE IF NOT EXISTS operation(
    idOperation INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    idBook INTEGER,
    idClient INTEGER,
    `type` ENUM("S", "L", "R") NOT NULL COMMENT 'S: SALE, L: LEND, R: RETURNED',
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    active TINYINT(1) NOT NULL DEFAULT 1
);

Mi tabla quedo así

CREATE TABLE IF NOT EXISTS operations (
    operation_id INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
    book_id INTEGER UNSIGNED,
    client_id INTEGER UNSIGNED,
    type ENUM('B','R','S') NOT NULL COMMENT 'Borrow, Return, Sell ',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    finish TINYINT(1) NOT NULL 
);
Me surge una duda con este ejemplo de la tabla **operations.** En un escenario real haríamos una operación que pudiera ser tanto la compra, venta y/o devolución de libros al mismo tiempo. Si sólo se puede generar una de estas operaciones a la vez, entiendo que eso tiene una serie de limitaciones, como que el que atiende la librería sólo pueda guardar un registro a la vez en el sistema. Sin embargo, si creásemos otra estructura en nuestra tabla que nos permitiera añadir información sobre todas las "sub operaciones" (alguien que compra un libro y devuelve otros) que puede contener una operación sería más eficiente, pero también aumenta la complejidad de la misma. ¿Cuáles son vuestras opiniones? ¿Cómo se podría hacer algo así?
```js CREATE TABLE IF NOT EXISTS operations ( operations_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, book_id INTEGER UNSIGNED NOT NULL, client_id INTEGER UNSIGNED NOT NULL, sale ENUM('lend', 'returned', 'sell') NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, finished TINYINT(1) NOT NULL ); ```CREATE TABLE IF NOT EXISTS operations ( operations\_id INTEGER UNSIGNED PRIMARY KEY AUTO\_INCREMENT NOT NULL, book\_id INTEGER UNSIGNED NOT NULL, client\_id INTEGER UNSIGNED NOT NULL, sale ENUM('lend', 'returned', 'sell') NOT NULL, created\_at TIMESTAMP NOT NULL DEFAULT CURRENT\_TIMESTAMP, updated\_at TIMESTAMP NOT NULL DEFAULT CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP, finished TINYINT(1) NOT NULL );
Aquí mi solución: ```js CREATE TABLE operations( operation_id INTEGER UNSIGNED AUTO_INCREMENT, book_id INTEGER UNSIGNED, client_id INTEGER UNSIGNED, `type` ENUM('L', 'R', 'S') NOT NULL COMMENT 'L: LEND, R: RETURNED, S: SELL', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, finished TINYINT(1) NOT NULL, PRIMARY KEY(operation_id)); ALTER TABLE operations ADD CONSTRAINT book_id FOREIGN KEY (book_id) REFERENCES platzi_operation.books(book_id) ON DELETE NO ACTION ON UPDATE CASCADE; ALTER TABLE operations ADD CONSTRAINT client_id FOREIGN KEY (client_id) REFERENCES platzi_operation.clients(client_id) ON DELETE NO ACTION ON UPDATE CASCADE; ```

12:01

“Al momento que inserto un dato, tanto created_at como update_at va a tener el mismo valor pero en el momento en el que yo modifique cualquier cosa en la tupla de Juanito que inserté ayer, si yo hago una modificación ya sea en el email, le pongo un acento que estaba mal en su nombre, o de activo lo paso a no activo (de 1 lo paso a 0), el created_at no se va a modificar en lo más mínimo a menos que yo le mande un dato específico. Pero si yo no mando esas columnas con valores (lo veremos en el INSERT cómo hacer y cómo no hacerlo), el update_at se va a modificar y me va a dar un dato nuevo. Y esto es metainformación que no le corresponden al usuario completamente sino a toda la ejecución e interacción del usuario con el sistema, que nos va a crear más información. Por ejemplo, este tipo de datos nos va a ayudar a saber
cuántos usuarios fueron creados la semana pasada
de esos usuarios , cuántos fueron modificados después de haber creado el usuario (la diferencia es que los created_at van a ser diferentes de los update_at.
O podemos saber cuales fueron creados el año pasado pero actualizados este año.
Y así, estos datos y metadatos nos sirven para operar de manera más inteligente nuestro negocio”

Hello!CREATE TABLE IF NOT EXISTS operations(    operation\_id INT UNSIGNED PRIMARY KEY AUTO\_INCREMENT,    book\_id INT UNSIGNED,    client\_id INT UNSIGNED,    operation\_status ENUM('lend', 'returned', 'sell') NOT NULL,    created\_at TIMESTAMP NOT NULL DEFAULT CURRENT\_TIMESTAMP,    updated\_at TIMESTAMP NOT NULL DEFAULT CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP,    finished TINYINT(1) NOT NULL); Dejo mi solución al reto del profe (no he puesto lo de INSERT INTO, porque no tengo ni idea de cómo usarlo todavía) ```js CREATE TABLE IF NOT EXISTS operations( operation_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, book_id INT UNSIGNED, client_id INT UNSIGNED, operation_status ENUM('lend', 'returned', 'sell') NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, finished TINYINT(1) NOT NULL ); ```
Aquí está mi código de creación de la tabla operations ```txt CREATE TABLE IF NOT EXISTS operations( operations_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, book_id INTEGER UNSIGNED NOT NULL, client_id INTEGER UNSIGNED NOT NULL, `type` ENUM('prestado','devuelto','vendido') NOT NULL, create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, finished TINYINT(1) NOT NULL ); ```
QUE SIGNIFICA ESTE WARNING: mysql> CREATE TABLE clients ( -> client\_id INTEGER UNSIGNED PRIMARY KEY AUTO\_INCREMENT, -> namee VARCHAR(50) NOT NULL, -> email VARCHAR(100) NOT NULL UNIQUE, -> birthdate DATETIME, -> gender ENUM('M', 'F', 'ND') NOT NULL, -> active TINYINT(1) NOT NULL DEFAULT 1, -> created\_at TIMESTAMP NOT NULL DEFAULT CURRENT\_TIMESTAMP, -> updated\_at TIMESTAMP NOT NULL DEFAULT CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP -> -> ); Query OK, 0 rows affected, 1 warning (0.02 sec) mysql> SHOW WARNINGS; +---------+------+------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------------------------------------------+ ***<u>| Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |</u>*** +---------+------+------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

CREATE TABLE operations (
operation_id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
book_id int(10) DEFAULT NULL,
client_id int(10) DEFAULT NULL,
type enum(‘P’,‘D’,‘V’) DEFAULT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

A continuación dejo mi código.
Se que lo coloque todo en minusculas, pero bueno…

create table if not exists operation (
operation_id int unsigned primary key auto_increment,
book_id int unsigned,
client_id int unsigned,
operation_type enum (‘P’, ‘D’, ‘V’) not null COMMENT ‘P:Prestado, D:Devuelto y V:Vendido’,
created_at timestamp not null default current_timestamp,
updated_at timestamp not null default current_timestamp on update current_timestamp,
finished tinyint(1) not null
);

Son solamente dos opciones…jaja

CREATE TABLE IF NOT EXISTS operations(
    `operation_id` INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    `book_id` INTEGER UNSIGNED,
    `client_id` INTEGER UNSIGNED,
    `type` ENUM('L', 'R', 'S') NOT NULL COMMENT 'L:LEND -R:RETURNED -S:SOLD',
    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `finished` TINYINT(1) NOT NULL
);

Así hice la tabla

CREATE TABLE IF NOT EXISTS operations(
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	book_id INTEGER UNSIGNED,
	client_id INTEGER UNSIGNED,
	type ENUM('borrowed', 'returned', 'sold') NOT NULL,
	created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	finished TINYINT(1) NOT NULL,
	FOREIGN KEY (book_id) REFERENCES books(book_id),
	FOREIGN KEY (client_id) REFERENCES clients(client_id)
);

Reto de la clase

CREATE TABLE IF NOT EXISTS operations (
operations_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
book_id INT UNSIGNED, client_id INT UNSIGNED,
type ENUM ('prestado', 'devuelto', 'vendido') DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finshed TINYINT NOT NULL DEFAULT 1);

La sentencia sin ningun warnings

CREATE TABLE clients (
  client_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  email varchar(100) NOT NULL UNIQUE,
  birthdate DATETIME,
  gender ENUM('M','F', 'ND') NOT NULL,
  active TINYINT NOT NULL DEFAULT 1,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Clients
CREATE TABLE IF NOT EXISTS clients (
	client_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(50) NOT NULL,
	email VARCHAR(100) NOT NULL UNIQUE,
	birthdate DATETIME,
	gender 	ENUM('M','F','ND'),
	active TINYINT(1) NOT NULL DEFAULT 1,
	created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Operations
CREATE TABLE IF NOT EXISTS operations(
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    book_id INTEGER UNSIGNED,
    client_id INTEGER UNSIGNED,
    `type` ENUM('borrowed', 'sold', 'returned') NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    finished TINYINT(1) NOT NULL
);```

Esta es mi solución 💚

CREATE TABLE IF NOT EXISTS operations(
  operations_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  book_id INTEGER UNSIGNED NOT NULL,
  client_id INTEGER UNSIGNED NOT NULL,
  type ENUM('prestado', 'devuelto', 'vendido') NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT ON UPDATE CURRENT_TIMESTAMP,
  finished TINYINT NOT NULL
);

CREATE TABLE IF NOT EXISTS operations (
operation_id INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
book_id INTEGER UNSIGNED NOT NULL,
cliente_id INTEGER UNSIGNED NOT NULL,
operation_type ENUM (‘prestado’,‘devuelto’,‘vendido’) NOT NULL,
create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finshed TINYINT(1) NOT NULL DEFAULT ‘0’
);

La elección entre TIMESTAMP y DATETIME depende de los requisitos específicos de tu aplicación y del SGBD que estés utilizando. Si necesitas una mayor precisión o la capacidad de manejar zonas horarias, TIMESTAMP puede ser más adecuado. Si solo necesitas almacenar fechas y horas hasta el segundo y no tienes requisitos de zona horaria, DATETIME puede ser suficiente.

CREATE TABLE IF NOT EXISTS operations (
  operation_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  books_id INT UNSIGNED NOT NULL,
  clients VARCHAR(50) NOT NULL UNIQUE,
  `type` ENUM('V', 'C', 'D'),
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  finished TINYINT(1) NOT NULL
);

Mi solución

CREATE TABLE IF NOT EXISTS operations (
    operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    book_id INTEGER UNSIGNED NOT NULL,
    client_id INTEGER UNSIGNED NOT NULL,
    operation_date DATETIME NOT NULL,
    type ENUM('lend', 'sell') NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modifed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    finished TINYINT(1) NOT NULL DEFAULT 0
);

Creo que para una mejor sintaxis en ingles se podría cambiar el nombre de la tabla clients por customers al menos que quieras tener por aparte una tabla clientsque serían los clientes fijos que tienen cierta cantidad de privilegios con nuestra librería.

CREATE TABLE IF NOT EXISTS operations (
operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
book_id INTEGER UNSIGNED NOT NULL,
client_id INTEGER UNSIGNED NOT NULL,
type ENUM(‘prestado’, ‘devuelto’, ‘vendido’) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finshed TINYINT(1) NOT NULL
);

Mi tabla

-- TABLA OPERACION
CREATE TABLE IF NOT EXISTS operations(
    `operation_id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `book_id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `client_id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `type` ENUM('PRESTAMO', 'RETORNADO', 'VENDIDO') NOT NULL,
    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
        ON UPDATE CURRENT_TIMESTAMP
    `finshed` TINYINT(1) not NULL
);

Así, creo, se soluciona el ejercicio propuesto:

<CREATE TABLE IF NOT EXISTS operations (
operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
book_id INTEGER UNSIGNED NOT NULL,
client_id INTEGER UNSIGNED NOT NULL,
opertation_type ENUM('prestado', 'devuelto', 'vendido') NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finished TINYINT(1) NOT NULL 
);> 

CREATE TABLE IF NOT EXISTS operaciones(
Idoperacion INTEGER PRIMARY KEY AUTO_INCREMENT,
book_id INTEGER NOT NULL,
idcliente INTEGER NOT NULL,
estado ENUM(‘Prestado’, ‘Devuelto’, ‘Vendido’) NOT NULL,
create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finalizado TINYINT (1) NOT NULL
);

quiero comprar motul

No estoy seguro pero la tabla operations puede ser algo asi:

CREATE TABLE IF NOT EXISTS operations(
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	book_id INTEGER UNSIGNED,
	client_id INTEGER UNSIGNED,
	`type` ENUM('prestado', 'devuelto', 'vendido') NOT NULL,
	create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	finished TINYINT(1) NOT NULL
);

datetime: desde cualquier año
timestamp: formato yyyy-mm-dd, hh-mm-ss desde el año 1970 contabiliza

Si quieren renombrar una columna pueden seguir el siguiente ejemplo, donde cambio el nombre de la columna cliend_id a client_id de la tabla clients.

ALTER TABLE clients RENAME COLUMN cliend_id TO client_id;

Mi solución al reto


CREATE TABLE IF NOT EXISTS operations(
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	book_id INTEGER UNSIGNED ,
	clienT_id INTEGER UNSIGNED,
	`type` ENUM('lend','sold','returned') NOT NULL,
	created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
		ON UPDATE CURRENT_TIMESTAMP,
	finished TINYINT NOT NULL
);

Siento que falta la recepción de los FK, pero solo ha hablado que se debe poner del mismo tipo, me imagino que nos hará Alterar las tablas después.

CREATE TABLE IF NOT EXISTS operations (
	operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	book_id INTEGER UNSIGNED,
	client_id INTEGER UNSIGNED,
	`type` ENUM('lend', 'returned', 'sell') NOT NULL,
	created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	finshed TINYINT(1) NOT NULL DEFAULT 0
);

Lista mi tarea compilando

mysql> desc operations;
+--------------+-------------------+------+-----+-------------------+-----------------------------------------------+
| Field        | Type              | Null | Key | Default           | Extra                                         |
+--------------+-------------------+------+-----+-------------------+-----------------------------------------------+
| operation_ID | int unsigned      | NO   | PRI | NULL              | auto_increment                                |
| book_id      | int unsigned      | YES  |     | NULL              |                                               |
| client_id    | int unsigned      | YES  |     | NULL              |                                               |
| type         | enum('V','P','D') | NO   |     | NULL              |                                               |
| created_at   | timestamp         | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED                             |
| updated_at   | timestamp         | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
| finished     | tinyint(1)        | NO   |     | NULL              |                                               |
+--------------+-------------------+------+-----+-------------------+-----------------------------------------------+
7 rows in set (0.00 sec)

mysql>

CREATE TABLE IF NOT EXISTS book_client (
id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
book_id INTEGER UNSIGNED NOT NULL,
client_id INTEGER UNSIGNED NOT NULL,
type ENUM(‘prestado’,‘vendido’, ‘devuelto’) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finished TINYINT(1) NOT NULL
);

CREATE TABLE IF NOT EXISTS operations(
    operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    book_id INTEGER UNSIGNED,
    client_id INTEGER UNSIGNED,
    type ENUM('lend', 'returned', 'sell'),
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

);

Debo aclarar algo ,al comienzo me quejaba de este docente, a pesar que se ve que es un maestro con muchísima experiencia ,sentía que no le entendía mucho ,pero ya siguiendo los videos ,le estoy entiendo bastante ,brinda mucha información , aunque sí a veces me pierdo un poco ,pero se nota que es un maestro capo.

  • CODE SQL TABLE OPERATIONS

  • TERMINAL MYSQL

  • COPY CODE

CREATE TABLE operations(
operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
book_id INTEGER UNSIGNED NOT NULL,
client_id INTEGER UNSIGNED NOT NULL,
`type`ENUM ('IN', 'OUT', 'BUY')  NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finshed TINYINT(1) NOT NULL 
);

CREATE TABLE IF NOT EXISTS operations(
operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
book_id INTEGER UNSIGNED ,
client_id INTEGER UNSIGNED ,
type ENUM(‘VENTA’,‘RENTA’,‘DEVOLUCION’) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
finished TINYINT(1) NOT NULL
);

No sé si esta correcto del todo, pero yo lo hice así

CREATE TABLE IF NOT EXISTS operations(
operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
book_id INTEGER UNSIGNED NOT NULL,
client_id INTEGER UNSIGNED NOT NULL,
`type` ENUM('lend','returned','sell') NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Hola acá esta mi aporte. Siento que falta algo más por agregar respecto a la relación que debe existir con el label op_type y el finished, pero me imagino que más adelante explicarán esto 😄

CREATE TABLE IF NOT EXISTS operations (
    operation_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    book_id INTEGER UNSIGNED,
    customer_id INTEGER UNSIGNED,
    op_type ENUM('LOANED', 'RETURNED', 'SOLD') COMMENT 'IF BOOK IS RETURNED OR SOLD, FINISHED LABEL WILL HAVE 1',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    price DOUBLE(6,2) NOT NULL DEFAULT 10.0,
    finished TINYINT(1) NOT NULL
);

ENUM()

sirve para especificar que valores puede recibir el campo, ejemplo:

gender ENUM('M','F','ND')

esto quiere decir que este campo solo recibe los valores que estan en la funcion ENUM()