Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保SQL数据库设计跨平台_Sql_Standards_Ansi Sql - Fatal编程技术网

如何确保SQL数据库设计跨平台

如何确保SQL数据库设计跨平台,sql,standards,ansi-sql,Sql,Standards,Ansi Sql,我正在从事一个项目,当前的开发环境基于MySQL,而生产环境可能是MySQL或Microsoft SQL Server。我正在努力确保为构建数据库表而编写的SQL是跨平台的 我已经发现ZEROFILL属性是非标准的,所以我假设它在MySQL之外不可用 创建表 `scfe`.`tbl\U用户角色`( `UserRoleRecID`INT(7)UNSIGNED NOT NULL自动增量注释'User Role Rec ID', `UserADID`CHAR(50)NOT NULL COMMENT'U

我正在从事一个项目,当前的开发环境基于MySQL,而生产环境可能是MySQL或Microsoft SQL Server。我正在努力确保为构建数据库表而编写的SQL是跨平台的

我已经发现ZEROFILL属性是非标准的,所以我假设它在MySQL之外不可用

创建表
`scfe`.`tbl\U用户角色`(
`UserRoleRecID`INT(7)UNSIGNED NOT NULL自动增量注释'User Role Rec ID',
`UserADID`CHAR(50)NOT NULL COMMENT'User ADID FK-tbl_Users.UserADID',
`UserRole`CHAR(150)NOT NULL COMMENT`User Role FK-sysbl\u SYS\u Roles.UserRoleID',
`状态'ENUM('A','I')不为NULL默认的'I'注释'用户角色状态-A=Active,I=Inactive//DEFAULT=I',,
`RoleDataAdded`DATETIME非空默认当前时间戳,
`RoleDataModified`DATETIME on update CURRENT_时间戳非空默认CURRENT_时间戳,
主键(`UserRoleRecID`),
索引'INDEX_UserADID'('UserADID'),
索引`INDEX\u UserRole`(`UserRole`),
索引'INDEX_RoleStatus'('Status'))
发动机=MyISAM;
由于我想确保代码能够在系统之间轻松转换,是否有其他不跨平台的功能/选项(例如,基于上述代码,是否有默认的
当前时间戳
?是否有应使用的替代方案


我知道引擎行不需要在MySQL之外使用。

您无法编写一条与MySQL和SQL Server相同的CREATE TABLE语句,并生成您现在拥有的内容,例如,生成ID需要一个
标识(…)SQL Server中的
选项,您可以在MySQL中使用自动增量。这两个选项都不是标准SQL(将始终作为标识生成)

数据类型是下一个问题。尤其是datetime/时间戳类型差异很大,您在这方面不会有太多运气。顺便说一句:停止使用
char()
-这种类型只有缺点,绝对没有任何优点

在跨DBMS设计中,无法使用枚举之类的东西。请改用查找表

约束和索引是下一个问题。列和表注释也是如此(SQL Server仅通过调用存储“扩展属性”的存储过程来“支持”它们)

例如,我建议使用XML格式,该格式可以轻松地用于各种数据库产品。例如,如果使用
autoIncrement=“true”
,Liquibase知道如何创建“生成的ID”列-它将使用
auto_increment
用于MySQL,
identity()
用于SQL Server,而
serial
用于Postgres

如果您使用“标准JDBC”数据类型,Liquibase还知道如何翻译它们。例如,SQL Server中的
时间戳
将变成
日期时间

您的声明将导致以下内容:



这可以通过使用参数或仅针对特定DBMS产品运行某些内容(例如创建检查约束或特殊索引类型)来扩展以处理需要特定于DBMS的内容(例如,
UUID
)的数据类型

您无法编写一条CREATE TABLE语句,该语句与MySQL和SQL Server的工作原理相同,并产生您现在拥有的结果,例如,生成ID需要SQL Server中的
标识(…)
选项,在MySQL中使用
自动增量
。这两个选项都不是标准SQL(将始终作为标识生成

数据类型是下一个问题。尤其是datetime/时间戳类型差异很大,您在这方面不会有太多运气。顺便说一句:停止使用
char()
-这种类型只有缺点,绝对没有任何优点

在跨DBMS设计中,无法使用枚举之类的东西。请改用查找表

约束和索引是下一个问题。列和表注释也是如此(SQL Server仅通过调用存储“扩展属性”的存储过程来“支持”它们)

例如,我建议使用XML格式,该格式可以轻松地用于各种数据库产品。例如,如果使用
autoIncrement=“true”
,Liquibase知道如何创建“生成的ID”列-它将使用
auto_increment
用于MySQL,
identity()
用于SQL Server,而
serial
用于Postgres

如果您使用“标准JDBC”数据类型,Liquibase还知道如何翻译它们。例如,SQL Server中的
时间戳
将变成
日期时间

您的声明将导致以下内容:



这可以通过使用参数或仅针对特定DBMS产品运行某些内容(例如创建检查约束或特殊索引类型)来扩展以处理需要特定于DBMS的内容(例如,
UUID
)的数据类型

@a_-horse_没有名字,你能推荐一个工具或参考在两者之间转换吗。如上所述,由于我不知道最终目标平台,所以我尝试不使用平台相关功能。@a_-horse_没有名字,你能推荐一个工具或参考在两者之间转换。如上所述,因为我不知道最终目标n平台我试图不使用依赖于平台的功能。