AXMLS数据库架构 - 默认值和外键

时间:2014-10-30 11:07:00

标签: adodb concrete5

我正在为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
    

这种格式的文档很少,有没有人成功使用它?

1 个答案:

答案 0 :(得分:1)

根据MySQL文档,您在创建表格时不会使用ADD CONSTRAINThttp://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>

还有更多建议:

  • 遵循由...设置的数据库表和列的命名约定 concrete5核心。您可以通过浏览核心数据库表轻松找出这些。
    • CamelCaseFormat中的表名(注意起始大写字母)。只有例外 此规则是BlockType表(以bt开头)和AttributeType表 (以at开头)。
    • 根据核心约定命名主键名称。例如。主键 Collections表格为cIDFiles表格的主键为fID。 在命名字段时尽量避免与核心主键发生冲突, 例如而不是使用&#34; cID&#34;作为类别表的名称,使用&#34; catID&#34;喜欢你 已经建议了。
    • 在字段名称中也使用camelCaseFormat(请注意较低的起始字母) 就像concrete5中的任何其他表一样。
  • 始终使用CamelCased格式的数据包表名前缀数据库表名。 例如。如果您的包的句柄是&#34; notification&#34;,您将创建数据库表 名为NotificationsTableName

遵循这些约定可以保持代码清洁,并且可以轻松阅读任何可能已经熟悉concrete5的未来开发人员,并可能会探索您的代码。虽然你不同意所有惯例,但最好是遵循它们,而不是让每个开发人员每次都重新发明轮子。