{"id":518,"date":"2023-10-19T13:50:05","date_gmt":"2023-10-19T11:50:05","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/?page_id=518"},"modified":"2025-07-26T15:50:21","modified_gmt":"2025-07-26T13:50:21","slug":"1-5-creacio-de-taules-i-restriccions","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/1-5-creacio-de-taules-i-restriccions\/","title":{"rendered":"1.5. Creaci\u00f3 de taules i restriccions"},"content":{"rendered":"<p>Una base de dades est\u00e0 formada per un conjunt de taules que ens permetran estructurar la informaci\u00f3 que percebem en un escenari concret del m\u00f3n real. Cada taula emmagatzemar\u00e0 en forma de registres la s\u00e8rie d\u2019exemples de cada classe d\u2019entitats o relacions entre entitats especificades pr\u00e8viament. Per crear una taula de registres buida amb l\u2019ordre <code>CREATE TABLE<\/code> cal primer declarar els seus atributs:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">CREATE TABLE nom\r\n    (camp1 tipus1 [NOT NULL, AUTO_INCREMENT],\r\n    camp2 tipus2 [NOT NULL, AUTO_INCREMENT],\r\n    ...\r\n    campN tipusN [NOT NULL, AUTO_INCREMENT],\r\n    PRIMARY KEY (campx, campy, ...),\r\n    [FOREIGN KEY (campx, campy, ...)\r\n    REFERENCES taula(campa, campb, ...)]);\r\n<\/pre>\n<p>A l\u2019hora de definir la classe d\u2019informaci\u00f3 que emmagatzemarem en cada atribut, MySQL proporciona una gran varietat de tipus num\u00e8rics i alfanum\u00e8rics b\u00e0sics (taula 2). L\u2019espai de mem\u00f2ria requerit per emmagatzemar cada variable dep\u00e8n de la precisi\u00f3 especificada en cada cas. Els tipus <code>DATE<\/code> i <code>TIME<\/code> resulten especialment \u00fatils per portar el registre de les nostres activitats en el temps. L\u2019usuari pot declarar, a m\u00e9s, variables del tipus objecte (en angl\u00e8s, <em>Binary Large Objects<\/em> o BLOB) per emmagatzemar fitxers de text, documents en format PDF o fins i tot imatges dins d\u2019alguna taula de la base de dades.<\/p>\n<div class=\"tabletitle\"><p><strong>Taula 2. Tipus de dades en MySQL<\/strong>.<\/p>\n<\/div>\n<table width=\"555\">\n<tbody>\n<tr class=\"table-header\">\n<td width=\"140\"><strong>\u00a0Tipus gen\u00e8ric<\/strong><\/td>\n<td width=\"415\"><strong>\u00a0Tipus MySQL<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"140\">\u00a0Sencer<\/td>\n<td width=\"415\"><code>TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT<\/code><\/td>\n<\/tr>\n<tr>\n<td width=\"140\">\u00a0Decimal<\/td>\n<td width=\"415\"><code>DECIMAL, FLOAT, DOUBLE\/REAL<\/code><\/td>\n<\/tr>\n<tr>\n<td width=\"140\">\u00a0Text<\/td>\n<td width=\"415\"><code>CHAR, VARCHAR, TINYTEXT, TEXT<\/code><\/td>\n<\/tr>\n<tr>\n<td width=\"140\">\u00a0Objectes<\/td>\n<td width=\"415\"><code>BLOB, MEDIUMBLOB, LONGBLOB<\/code><\/td>\n<\/tr>\n<tr>\n<td width=\"140\">\u00a0Temps<\/td>\n<td width=\"415\"><code>DATE, TIME<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"tablefooter\"><p>Font: elaboraci\u00f3 pr\u00f2pia.<\/p>\n<\/div>\n<p>Juntament amb la declaraci\u00f3 dels atributs, per crear una taula hem d\u2019especificar quin atribut o combinaci\u00f3 d\u2019atributs ser\u00e0 la clau prim\u00e0ria, identificant de forma un\u00edvoca cada inst\u00e0ncia. En cas d\u2019existir, les claus foranes per referenciar els atributs d\u2019altres taules tamb\u00e9 s\u2019han d\u2019indicar expl\u00edcitament.<\/p>\n<p>El dissenyador pot activar dos controls interns sobre el valor d\u2019un atribut en el moment de registrar noves inst\u00e0ncies a la base de dades. En primer lloc, \u00e9s possible rebutjar aquells registres que no posseeixin un valor definit per a un atribut concret. Aquesta circumst\u00e0ncia s\u2019especifica amb la construcci\u00f3 <code>NOT NULL<\/code>, just despr\u00e9s de la declaraci\u00f3 de tipus. <code>NOT NULL<\/code> seria una restricci\u00f3 de camp obligatori, no accepta valors nuls. En cas contrari, el sistema assignar\u00e0 per defecte el valor NULL a aquest camp i acceptar\u00e0 valors nuls. Aquest requeriment s\u2019ha de satisfer inexcusablement en aquells atributs que pertanyen a la clau prim\u00e0ria. En segon lloc, per als identificadors num\u00e8rics associats a cada inst\u00e0ncia, el propi sistema pot encarregar-se de gestionar un comptador autom\u00e0tic de valors mitjan\u00e7ant la construcci\u00f3 <code>AUTO_INCREMENT<\/code>.<\/p>\n<p>Tornant novament a la nostra base de dades <strong>cataleg<\/strong>, ens trobem ara en disposici\u00f3 de crear les taules del cat\u00e0leg de gens especificades formalment a les figures 18, 19, 20 i 21. Hem d\u2019escollir adequadament els tipus de dades per a cada atribut o camp, segons el seu contingut, definint clarament quines s\u00f3n les claus prim\u00e0ries i foranes. L\u2019usuari pot comen\u00e7ar creant les taules m\u00e9s elementals, \u00e9s a dir, aquelles que no posseeixen claus foranes (genomes i funcions). Observeu com declarem la clau prim\u00e0ria i ens assegurem que cap inst\u00e0ncia pot donar-se d\u2019alta a la base de dades amb un valor nul per a les claus prim\u00e0ries,<strong> esp\u00e8cie <\/strong>i <strong>funci\u00f3<\/strong>. Per verificar que el proc\u00e9s de creaci\u00f3 ha funcionat correctament, l\u2019usuari pot consultar la base de dades sobre les taules existents amb l\u2019ordre <code>SHOW TABLES<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">mysql&gt; SHOW TABLES;\r\n\r\nEmpty set (0,00 sec)\r\n\r\nmysql&gt; CREATE TABLE genomes\r\n    -&gt; especie VARCHAR(100) NOT NULL,\r\n    -&gt; nom VARCHAR(100),\r\n    -&gt; descripcio TEXT,\r\n    -&gt; PRIMARY KEY (especie));\r\n\r\nQuery OK, 0 row affected (0.28 sec)\r\n\r\nmysql&gt; CREATE TABLE funcions\r\n    -&gt; funcion VARCHAR(20) NOT NULL,\r\n    -&gt; descripcio VARCHAR(100),\r\n    -&gt; PRIMARY KEY (funcion));\r\n\r\nQuery OK, 0 row affected (0.03 sec)\r\n\r\nmysql&gt; SHOW TABLES;\r\n+-------------------+\r\n| Tables_in_cataleg |\r\n+-------------------+\r\n| funcions          |\r\n| genomes           |\r\n+-------------------+\r\n2 rows in set (0.00 sec)\r\n<\/pre>\n<p>\u00c9s possible revisar la definici\u00f3 d\u2019una taula amb la instrucci\u00f3 <code>DESCRIBE<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">mysql&gt; DESCRIBE genomes;\r\n+-------------+--------------+------+-----+---------+-------+\r\n| Field       | Type         | Null | Key | Default | Extra |\r\n+-------------+--------------+------+-----+---------+-------+\r\n| especie     | varchar(100) | NO   | PRI | NULL    |       |\r\n| nom         | varchar(100) | YES  |     | NULL    |       |\r\n| descripcio  | text         | YES  |     | NULL    |       |\r\n+-------------+--------------+------+-----+---------+-------+\r\n3 rows in set (0.01 sec)<\/pre>\n<p>A continuaci\u00f3, per crear la taula <strong>gens<\/strong>, a m\u00e9s de la clau prim\u00e0ria, indiquem un camp o atribut que \u00e9s la clau forana (que ha d\u2019apuntar o fer refer\u00e8ncia a la clau prim\u00e0ria de la taula <em>genomes<\/em>):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">mysql&gt; CREATE TABLE gens\r\n    -&gt; (nom VARCHAR(20) NOT NULL,\r\n    -&gt; cromosoma VARCHAR(5),\r\n    -&gt; cadena VARCHAR(1),\r\n    -&gt; inici INT,\r\n    -&gt; final INT,\r\n    -&gt; proteina VARCHAR(20),\r\n    -&gt; especie VARCHAR(100),\r\n    -&gt; PRIMARY KEY (nom),\r\n    -&gt; FOREIGN KEY (especie)\r\n    -&gt; REFERENCES genomes(especie));\r\n\r\nQuery OK, 0 rows affected (0.06 sec)\r\n\r\nmysql&gt; DESCRIBE gens;\r\n+------------+-------------+------+-----+---------+-------+\r\n| Field      | Type        | Null | Key | Default | Extra |\r\n+------------+-------------+------+-----+---------+-------+\r\n| nom        | varchar(20) | NO   | PRI | NULL    |       |\r\n| cromosoma  | varchar(5)  | YES  |     | NULL    |       |\r\n| cadena     | varchar(1)  | YES  |     | NULL    |       |\r\n| inici      | int(11)     | YES  |     | NULL    |       |\r\n| final      | int(11)     | YES  |     | NULL    |       |\r\n| proteina   | varchar(20) | YES  |     | NULL    |       |\r\n| especie    | varchar(100)| YES  | MUL | NULL    |       |\r\n+------------+-------------+------+-----+---------+-------+\r\n7 rows in set (0.00 sec)\r\n\r\n<\/pre>\n<p>Finalment, creem la taula <strong>anotacions <\/strong>per relacionar els gens amb les anotacions funcionals. Juntament amb els dos valors que identifiquen cada registre (<strong>gen<\/strong> i <strong>funci<\/strong><strong>\u00f3<\/strong>), afegirem un atribut per registrar l\u2019origen de la informaci\u00f3:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">mysql&gt; CREATE TABLE anotacions\r\n    -&gt; (nom VARCHAR(20) NOT NULL,\r\n    -&gt; funcio VARCHAR(20) NOT NULL,\r\n    -&gt; origen VARCHAR(20),\r\n    -&gt; PRIMARY KEY (nom, funcio),\r\n    -&gt; FOREIGN KEY (nom)\r\n    -&gt; REFERENCES gens(nom),\r\n    -&gt; FOREIGN KEY (funcio)\r\n    -&gt; REFERENCES funcions(funcio));\r\n\r\nQuery OK, rows affected (0.11 sec)\r\n\r\nmysql&gt; DESCRIBE anotacions;\r\n+---------+--------------+------+-----+---------+-------+\r\n| Field   | Type         | Null | Key | Default | Extra |\r\n+---------+--------------+------+-----+---------+-------+\r\n| nom     | varchar(20)  | NO   | PRI | NULL    |       |\r\n| funcio  | varchar(20)  | NO   | PRI | NULL    |       |\r\n| origen  | varchar(20)  | YES  |     | NULL    |       |\r\n+---------+--------------+------+-----+---------+-------+\r\n3 rows in set (0.01 sec)\r\n<\/pre>\n<p>\u00c9s possible definir altres restriccions als camps de les taules amb l\u2019ordre <code>CHECK<\/code>.<\/p>\n<p>Per exemple, podem indicar que un camp num\u00e8ric com el camp <strong>inci <\/strong>de la taula <strong>gens <\/strong>que \u00e9s tipus num\u00e8ric nom\u00e9s accepti valors positius <code>CHECK (inici &gt;0)<\/code>, o que un camp de tipus cadena de car\u00e0cters nom\u00e9s accepti determinats valors; per exemple, perqu\u00e8 el camp <em>hebra<\/em> de la taula <em>gens <\/em>nom\u00e9s accepti els car\u00e0cters \u00ab+\u00bb o \u00ab-\u00bb, podem fer <code>hebra ENUM(\u2018+\u2019,\u2019-\u2019)<\/code>.<\/p>\n<p>Un cop creada la taula podem modificar-la amb la instrucci\u00f3 <strong>ALTER TABLE<\/strong>.<\/p>\n<p>Per exemple, si volem eliminar el camp origen de la taula <strong>anotacions <\/strong>escrivim<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">ALTER TABLE anotacions DROP COLUMN origen;<\/pre>\n<p>i si volem tornar a afegir-hi el mateix camp escrivim<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">ALTER TABLE anotacions ADD origen VARCHAR(20);<\/pre>\n<p>Durant el temps de vida d\u2019una base de dades \u00e9s freq\u00fcent que n\u2019haguem d\u2019actualitzar el contingut. En determinats casos, aix\u00f2 pot implicar l\u2019eliminaci\u00f3 completa d\u2019usuaris, de taules o, fins i tot, de la pr\u00f2pia base de dades. Per implementar aquests serveis, MySQL posseeix la fam\u00edlia d\u2019ordres <code>DROP<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">DROP DATABASE basededades;\r\nDROP USER usuari;\r\nDROP TABLE taula;<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Una base de dades est\u00e0 formada per un conjunt de taules que ens permetran estructurar la informaci\u00f3 que percebem en un escenari concret del m\u00f3n real. Cada taula emmagatzemar\u00e0 en forma de registres la s\u00e8rie d\u2019exemples de cada classe d\u2019entitats o relacions entre entitats especificades pr\u00e8viament. Per crear una taula de registres buida amb l\u2019ordre [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/wp-json\/wp\/v2\/pages\/518"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/wp-json\/wp\/v2\/comments?post=518"}],"version-history":[{"count":15,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/wp-json\/wp\/v2\/pages\/518\/revisions"}],"predecessor-version":[{"id":1037,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/wp-json\/wp\/v2\/pages\/518\/revisions\/1037"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/gestion-de-datos\/wp-json\/wp\/v2\/media?parent=518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}