5

我正在尝试查找有关MySQL、PostgreSQL、SQLite 等开源数据库的正确RDBMS SQL 查询的信息。他们是否有任何预先组装的列表,或者我只需要梳理每个数据库引擎的文档(在某些情况下猜测正确的实现? ALTER TABLE vs CREATE INDEX

例如,到目前为止,我有这个 MySQL 的(部分)列表:

CREATE TABLE `%s` (...);
DROP TABLE IF EXISTS `%s` %s;
ALTER TABLE `%s` RENAME TO `%s`;

ALTER TABLE `%s` ADD COLUMN %s;
ALTER TABLE `%s` DROP COLUMN `%s` %s;
ALTER TABLE `%s` RENAME COLUMN `%s` to `%s`;

ALTER TABLE `%s` ADD CONSTRAINT `%s` FOREIGN KEY (`%s`) REFERENCES `%s` (`%s`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `%s` ADD CONSTRAINT `%s` UNIQUE (`%s`);
ALTER TABLE `%s` DROP CONSTRAINT `%s` %s;

CREATE INDEX `%s` USING BTREE ON `%s` (`%s`);
DROP INDEX IF EXISTS `%s` %s;
4

3 回答 3

4

我从来没有见过类似的,但你可以为 ANSI SQL 获得 EBNF

http://savage.net.au/SQL/

于 2012-09-18T16:01:26.990 回答
0

我想到的一个肮脏的技巧是使用像 Hibernate 这样的 O/R 引擎对此进行建模。开发带注释的类或 .hbm.xml 文件,只需打开hbm2ddl =auto 并针对您的数据库列表运行它。使用show_sql属性记录 hibernate 生成的所有 DML/DDL...

我假设像 hibernate 这样的 O/R 框架已经看到了世界并且可以处理已建立的 RDBMS 平台的所有细微差别。但是,我不确定 hibernate 是否尝试生成尽可能通用或尽可能本地方言的 DDL 脚本。

希望这可以帮助 ;)

于 2013-08-13T13:47:53.970 回答
0

您可以查看一些 ActiveRecord 实现以获取线索。他们尝试为查询实现一个公共层。大多数框架都为 SQL 引擎提供了某种抽象。Win 可移植性失去了每个数据库供应商的特殊实现细节。

如果您有时间,可以查看每个数据库文档并创建解析器。对于 Postgresql 数据库,您可以在手册中检查命令结构:http ://www.postgresql.org/docs/9.0/static/sql-commands.html 。

一个小例子的 Postgresql 在表上添加模式名称。默认使用公共架构。

CREATE TABLE "%s"."%s" (...);
于 2013-08-08T22:39:36.957 回答