在建立好资料库以后,就可以根据储存资料的需求,使用SQL叙述建立所有需要的表格(table)。建立表格的设定非常多,以建立「world.city」表格来说,它的叙述会像这样:
根据不同的需求,建立表格的语法有好几种,下列是建立表格基本的语法:
MySQL规定一个表格中至少要有一个栏位,在设定表格中的栏位时,至少要明确的决定栏位的名称与型态,其它的栏位设定都是选择性的,如果有一个以上栏位,要使用逗号隔开:
使用需要的资料型态,就可以建立一个可以储存亲友通讯录的表格:
建立表格的时候可以使用「IF NOT EXISTS」选项,预防发生表格已存在的错误:
建立表格的时候也可以为表格加入需要的表格属性(table attributes)设定,这里会先讨论关于储存引擎、字元集和collation的属性设定。如果你在建立表格的时侯,没有指定这些属性,MySQL会使用伺服器预设的储存引擎作为表格的储存引擎,字元集与collation会使用资料库预设的设定。
你可以针对表格的需求,设定它使用的储存引擎、字元集与collation:
下列的叙述在建立「addressbook」表格的时候,使用「ENGINE」、「CHARCTER SET」和「COLLATE」设定表格自己使用的储存引擎、字元集与collation:
注:根据语法的说明,「CHARCTER SET」也可以使用比较简短的「CHARSET」;另外在设定时都可以省略「=」。
MySQL资料库伺服器支援许多不同应用的储存引擎,你可以使用「SHOW ENGINES」查询:
在建立表格的时候,如果没有使用「ENGINE」设定储存引擎,那就会使用MySQL资料库伺服器预设的储存引擎。你可以使用下列的方式修改MySQL资料库伺服器预设的储存引擎设定:
在建立表格时指定字元集与collation会有一些不同的组合。如果只有指定字元集,MySQL会使用你指定字元集的预设collation:
如果只有使用「COLLATE」指定collation,MySQL会使用你指定collation所属的字元集:
注:建立表格的时候,不管你有没有指定,表格都会有字元集与collation的设定。在这个表格中的「非二进位制、non-binary」字串型态栏位,还有「ENUM」与「SET」型态栏位,都会使用表格预设的字元集与collation。
如果一个栏位的型态是字串的话,你还可以依照需求加入字串型态的栏位属性(column attributes)。「非二进位制、non-binary」字串可以额外设定字元集与collation:
每一个表格都会有一个预设的字元集与collation设定,如果没有指定栏位的字元集与collation,就会使用预设的设定:
数值型态栏位专用的属性设定有「UNSIGNED」、「ZEROFILL」与「AUTO_INCREMENT」:
注:数值型态栏位设定为「UNSIGNED」与「ZEROFILL」的效果在「第八章、表格与索引、建立表格、数值栏位属性」中已经讨论过;而「AUTO_INCREMENT」的设定与索引有关,所以在这一章后面索引的部份一起讨论。
除了字串与数值两种栏位专用的栏位属性设定外,还有许多可以用在所有型态的栏位属性:
「NOT NULL」栏位属性可以用来禁止某个栏位储存「NULL」值,一般来说,「NULL」值用来表示一个栏位的资料是「不确定」、「未知」或「没有」 。不过有一些栏位并不能出现「NULL」值,不然就会成为一笔很奇怪的纪录了:
使用「NULL」或「NOT NULL」设定栏位属性后,在查询表格栏位资讯时,是在「Null」栏位用「YES」或「NO」来表示:
如果一个表格中,有设定为「NOT NULL」的栏位,那就要注意你在新增或修改纪录时指定的资料,不能够违反这些规则:
使用「DEFAULT」关键字可以设定栏位的预设值,你可以自己指定任何想要的预设值,在新增或修改资料的时候都有可能会使用到栏位的预设值。要特别注意的是MySQL限制你的预设值只能是「一个明确的值」,也就是预设值的设定不可以使用任何函式或运算式。
如果你没有为栏位使用「DEFAULT」关键字设定预设值,而且也没有设定为「NOT NULL」,MySQL会自动为你加入预设值的设定:
以通讯录表格来说,如果纪录的地址大部份都是「Taipei」的话,你可以为「address」栏位设定一个预设值:
使用「DEFAULT」关键字加入预设值的设定以后,就可以在新增或修改资料的时候使用:
预设值的设定要注意下列的规则:
注:「UNIQUE KEY」与「PRIMARY KEY」在这一章后面索引的部份一起讨论。
「TIMESTAMP」栏位是日期时间资料的一种,它除了具有「时区、timezone」的特性外,也可以搭配「DEFAULT」和「ON UPDATE」来完成一些比较特殊的需求:
在表格中使用「TIMESTAMP」型态的栏位时,如果你没有设定它们的栏位属性,MySQL会自动帮你在第一个「TIMESTAMP」栏位加入「NOT NULL」、「DEFAULT」和「ON UPDATE」三个栏位属性的设定。
其它没有设定栏位属性的「TIMESTAMP」栏位,MySQL会帮你加入「NOT NULL」与「DEFAULT」两个栏位属性。
「DEFAULT CURRENT_TIMESTAMP」栏位属性的效果,在你新增纪录的时候就可以看得出来了:
而「ON UPDATE CURRENT_TIMESTAMP」栏位属性,会在修改纪录的时候产生效果:
「TIMESTAMP」栏位型态很适合用来记录资料新增或修改的日期与时间。可是如果在同一笔纪录中,要使用一个栏位记录新增资料的日期与时间,而使用另一个栏位记录修改资料的日期与时间。为了应付这样的需求,你应该会使用下列的栏位定义:
在一个表格中,MySQL限制「CURRENT_TIMESTAMP」只能在一个栏位出现,所以当有这样的需求出现时,你必须使用MySQL提供给你的特殊设定方式来解决:
建立好这样的表格以后,看起来虽然怪怪的,不过当你指定「created」栏位的值为「NULL」的时候,MySQL会自动为你填入目前的日期与时间:
后续在修改资料的时候,就只会在「updated」栏位填入目前的日期与时间:
在资料库中建立需要的表格,通常是使用上列讨论的方式,根据自己的需求,建立一个新的表格来储存需要保存的资料;在一些比较特别的情况,你可能会使用一个现有的表格来建立新的表格,这样的需求可以使用下列的语法:
以「world」资料库中的「city」来说,下列的查询叙述可以传回台湾的城市与人口数:
如果你想要建立一个新表格,这个表格中的资料就是上列查询的结果,就可以使用这种建立表格的语法:
使用这种语法建立的新表格,可以省略栏位定义的工作,新表格会使用原有表格的栏位名称与定义,而且在查询叙述中传回的资料,会直接新增到新建立的表格中:
你也可以在建立新表格的时候,使用栏位定义来设定新表格的栏位型态与其它属性:
如果需要的话,也可以加入查询叙述中没有的栏位:
使用这种语法建立表格时有下列几个重点:
如果只需要借用一个已经存在的表格栏位定义,可是并不需要纪录资料的话,你可以使用下列的语法来建立新表格:
使用这种语法建立的新表格,并不会新增纪录到新表格中,可是包含索引与「AUTO_INCREMENT」设定都会套用在新表格,除了下列两个例外:
上列讨论的建立表格方式,都可以在建立表格的时候,依照需要加入「TEMPORARY」关键字,指定这个新建立的表格为「用户端暂时存在」的表格:
「TEMPORARY」表格有下列重点: