我正在为Concrete5开发一个包,它使用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)
已创建和已修改字段的默认值。我想创建一个默认值的当前日期,而对于修改我想要ON UP 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
这种格式的文档很少,有没有人成功使用它?
答案 0 :(得分:1)
根据MySQL文档,您在创建表格时不会使用ADD CONSTRAINT
:
http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
其次,根据ADOdb文档,所有<constraint>
定义都必须位于<field>
定义内:
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>
还有更多建议:
bt
开头)和AttributeType表
(以at
开头)。Collections
表格为cID
,Files
表格的主键为fID
。
在命名字段时尽量避免与核心主键发生冲突,
例如而不是使用&#34; cID&#34;作为类别表的名称,使用&#34; catID&#34;喜欢你
已经建议了。遵循这些约定可以保持代码清洁,并且可以轻松阅读任何可能已经熟悉concrete5的未来开发人员,并可能会探索您的代码。虽然你不同意所有惯例,但最好是遵循它们,而不是让每个开发人员每次都重新发明轮子。