Salta el contingut

DDL - Creació de Taules i Restriccions

Aquest document ha de mostrar les diferents opcions de la comanda ALTER TABLE per a poder afegir i eliminar restriccions.

Sempre és molt millor consultar el manual online per a veure’n totes les possibilitats.

Les paraules claus per buscar en la comanda ALTER TABLE son: ADD, DROP, ...

ALTER TABLE ADD

Per afegir restriccions utilitzarem la comanda ALTER TABLE amb la següent sintaxis:

ALTER TABLE <taula>
    ADD CONSTRAINT <constraint_name> CHECK (<expressió>);

ALTER TABLE <taula>
    ADD CONSTRAINT <constraint_name>
        PRIMARY KEY ( <nom_columna1>, <nom_columna2>, ...);

ALTER TABLE <taula>
    ADD CONSTRAINT <constraint_name>
        FOREIGN KEY ( <nom_columna1>, <nom_columna2>, ...)
        REFERENCES <taula_p> ( <nom_col1>, <nom_col2>, ...);

ALTER TABLE <taula>
    ADD CONSTRAINT <constraint_name> UNIQUE(<col1>, <col2>, );

ALTER TABLE DROP

Per eliminar restriccions utilitzarem la comanda ALTER TABLE amb la següent sintaxis; sovint és important conèixer el nom de la restricció.

ALTER TABLE <nom_taula>
    DROP CONSTRAINT [IF EXISTS] <nom_restricció>;
ALTER TABLE <nom_taula>
    DROP PRIMARY KEY;
ALTER TABLE <nom_taula>
    DROP {INDEX|KEY} [IF EXISTS] <nom_index>;
ALTER TABLE <nom_taula>
    DROP FOREIGN KEY [IF EXISTS] <nom_restricció>;

La primera opció és sempre vàlida.

Consultes al diccionari - CHECK

Podem consultar els CHECKs d’una base o taula en la taula CHECK_CONSTRAINTS de la base information_schema.

SELECT TABLE_NAME, CONSTRAINT_NAME, CHECK_CLAUSE
FROM CHECK_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = 'test';
+-------+------------+-----------------------------------------+
|taula  |constraint_n|check_clause                             |
+-------+------------+-----------------------------------------+
|adreces|CODI_POSTAL |`CODI_POSTAL` between '01000' and '52999'|
|t1     |C4          |`C4` > 0                                 |
|t10    |SOU         |`SOU` > 0                                |
|t10    |T10_DATES_CK|`DATA_INICI` < `DATA_FI`                 |
|t2_2   |T2_2_D_T2_NN|`D_T2` is not null                       |
+-------+------------+-----------------------------------------+

Consultes al diccionari - REFERENCES

Podem consultar la taula REFERENTIAL_CONSTRAINTS per trobar les PKs i les FKs.

SELECT TABLE_NAME, REFERENCED_TABLE_NAME,
       CONSTRAINT_NAME, UPDATE_RULE, DELETE_RULE
FROM REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = 'TEST';
+---------+-----------+-------------------+----------+----------+
| taula   | taula_ref | CONSTRAINT_NAME   | Update   | Delete   |
+---------+-----------+-------------------+----------+----------+
| adreces | paisos    | FK_ADRECES_PAISOS | RESTRICT | RESTRICT |
| t3      | t2_1      | FK_T3_T2_1        | RESTRICT | RESTRICT |
| t9      | t8        | T9_T8_ID_1        | RESTRICT | RESTRICT |
| t9      | t8        | T9_T8_ID_2_ID_3   | CASCADE  | SET NULL |
+---------+-----------+-------------------+----------+----------+

I les columnes afectades a la taula KEY_COLUMN_USAGE

SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, ORDINAL_POSITION
FROM KEY_COLUMN_USAGE
WHERE CONSTRAINT_SCHEMA = 'TEST'
ORDER BY 1,2,4;
+---------+-------------------+----------+---+
| t4      | C1                | C1       | 1 |
| t4      | C2                | C2       | 1 |
| t4      | C3                | C3       | 1 |
| adreces | FK_ADRECES_PAISOS | ID_PAIS  | 1 |
| t3      | FK_T3_T2_1        | ID_T2    | 1 |
| t3      | PRIMARY           | ID_T3    | 1 |
| t3      | PRIMARY           | ID_T2    | 2 |
| t4      | T4_C5_UK          | C5       | 1 |
| t4      | T4_C5_UK          | C6       | 2 |
| t8      | T8_ID_2_ID_3_UU   | ID_2     | 1 |
| t8      | T8_ID_2_ID_3_UU   | ID_3     | 2 |

Diccionari de dades

Recorda que tens el diccionari de dades a la base information_schema i que les taules afectades solen ser:

Us animem a investigar més taules del diccionari de dades, show tables, a la base information_schema o mysqlsi sou root.