AXMLS数据库模式 - 默认值和外键
我正在开发一个Concrete5包,它使用AXMLS格式来指定数据库模式。AXMLS数据库模式 - 默认值和外键
http://www.concrete5.org/documentation/how-tos/developers/creating-and-working-with-db-xml-files/
这里是架构:
<?xml version="1.0"?>
<schema version="0.3">
<table name="notificationCategory">
<field name="id" type="I"> <!-- integer -->
<key/>
<autoincrement/>
</field>
<field name="name" type="C" size="255"> <!-- varchar(255) -->
</field>
<field name="created" type="T">
<deftimestamp/>
</field>
<field name="modified" type="T">
</field>
<opt>
Type=InnoDB
</opt>
</table>
<table name="notificationEntry">
<field name="id" type="I"> <!-- integer -->
<key/>
<autoincrement/>
</field>
<field name="name" type="C" size="255"> <!-- varchar(255) -->
</field>
<field name="cat_id" type="I">
</field>
<constraint>
ADD CONSTRAINT `cat_id_ibfk_1` FOREIGN KEY (`cat_id`) REFERENCES `notificationCategory`.(`id`) ON DELETE CASCADE
</constraint>
<opt>
Type=InnoDB
</opt>
</table>
</schema>
我有两件事情挣扎:
外键。下面的结果是NotificationEntry表,其中外键未被设置(它使用的是InnoDB)
-
创建和修改字段的默认值。我想创建具有当前日期的默认值,而修改的,我想对UPDATE CURRENT_TIMESTAMP
show create table notificationCategory; CREATE TABLE `notificationCategory` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
有这个格式提供很少的文件,有没有人使用有成功它?
按照MySQL文档,当你创建表你不使用ADD CONSTRAINT
: http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
其次,所有<constraint>
定义需要的<field>
定义内按ADOdb的文档: http://adodb.sourceforge.net/docs-datadict.htm
定义的附加约束在字段定义的末尾。
第三,约束定义在它前面需要一个逗号,因为它在CREATE TABLE
块的末尾连接在一起,所以生成的MySQL在没有逗号的情况下无效。我不确定这是否记录在任何地方,但ADOdb文档页面上的PostgreSQL示例在语句前面显示逗号。
所以,你的字段定义和约束应该是这样的:
<field name="catID" type="I">
<constraint>
, FOREIGN KEY (catID) REFERENCES NotificationsNotificationCategory(catID) ON DELETE CASCADE
</constraint>
</field>
而且几个建议:
- 遵循的命名约定由 concrete5核心设置数据库表和列。通过探索核心数据库表,您可以很容易地找出这些问题。
- CamelCaseFormat中的表名(注意起始大写字母)。此规则只有 的例外是BlockType表(从
bt
开始)和AttributeType表 (从at
开始)。 - 按照核心约定命名主键名称。例如。
Collections
表的主键为cID
,Files
表的主键为fID
。 尝试避免命名字段时可能与核心主键冲突,例如 而不是使用“cID”作为你的分类表的名称,使用“catID”就像你已经建议的 。 - 在字段名称 中使用camelCaseFormat(注意较低的起始字母),就像混凝土中的任何其他表一样。
- CamelCaseFormat中的表名(注意起始大写字母)。此规则只有 的例外是BlockType表(从
- 始终以包格式在CamelCased格式中为数据库表名添加前缀。 例如如果你的包的把手是“通知”中,您将创建数据库表 命名NotificationsTableName
遵循这些约定让你的代码干净,可以轻松阅读任何可能的未来的开发人员已经熟悉concrete5和可探讨您的代码。虽然你不同意所有的约定,但最好遵循它们,而不是让每个开发者每次重新发明*。