2.3用MySQL建立一个食谱网站
在示例中,要为用户建立一个显示动态内容的食谱网站。首先需要创建一个数据库;我们姑且称其为recipes。接下来,可以创建几个表,这些表格用于填充数据库并且包含网站要呈现的内容。一开始,要设计一个表用于保存所有的食谱,另一个表包含食谱的类别。图2.1通过一幅图显示了基本的表结构。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=149 alt="" src="" width=367 border=0>
图2.1前两个表的基本关系图
因为每个食谱属于一个类别,所以给类别表一个唯一的ID列,用于指代食谱列(稍后在2.7节中将详细讲解)。
创建表
下面的SQL命令将生成表。可将它们输入MySQL命令行,或者使用像phpMyAdmin这样的图形化工具,可以在SQL标签下输入如下内容:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=78 alt="" src="" width=395 border=0>
498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=149 alt="" src="" width=427 border=0>
你会发现我们已将这两个表的id列标记为主键,在一个表内提供一个唯一的标识符是很好的做法,由此我们便有了查找特定记录的简便方法,而且添加主键列的值就会处理这个需求。这里添加了一个唯一的编号作为id,这使得MySQL更容易搜索正在寻找的记录。
另一种方法是在一列上添加一个唯一的约束使它成为主键。例如,我们可以说recipe.name列必须是唯一的。有了唯一name列,就完全不需要id列了,因为我们只需通过它们的名字就可以识别这些记录了。然而,这样也意味着改变食谱的名称将导致一个问题,特别是,如果其他表用该列引用特定的记录。使用字符串匹配键比使用数字id要慢一点,这解释了为何使用有int(整数)值的列作为主键,然后再添加auto_increment值给它,就像这些示例中的用法一样(我们马上会讲解自动递增),这已成为习惯做法。
已经创建的表提供了一些结构,可以在其中输入一些数据作为开始。希望这些与食物有关的例子不会让你感觉太饿!
498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=66 alt="" src="" width=484 border=0>
为categories表定义了两列:id和name,但在INSERT语句中只提供其中一列:name。那么这里发生了什么呢?事实上,这就是创建表时指定的auto_increment值开始发挥作用了,尽管还没有提供一个id列的值,但是MySQL仍会自动给该列使用一个唯一的数字,每当新建一行时数字会递增。
当新建表的时候,***个输入该列的值是1,下一值是2,依此类推。然而,当前***的数字实际上是作为表的属性存储。例如,在表中插入5行。MySQL给它们的id值是:1、2、3、4、5。在某些时候,如果不需要这些行,可将它们全部删除;稍后你会在这个貌似的空表中插入多行。这些新行的id值会从6开始,因为这个表记得什么数字是在删除前给这个行的***号。这就是自动递增在发生作用,当给recipes表添加新行时,会再次看到自动编号起作用:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=105 alt="" src="" width=638 border=0>
这些查询使用MySQL中NOW()函数插入当前日期和时间到一个表的列中,在这个示例中,就是created列。当使用PHP时,可以使用这个便利的自动化工具,而不是手动格式化日期和时间数据传入查询。
、