日期:2014-05-18  浏览次数:20579 次

怎样写建表语句(杂谈版)
今天看到一个名为“怎样写建表语句”的帖子,帖子针对的是一个具体问题。趁兴就这个话题杂谈一把。

怎样写建表语句?以下是我所知的方法:

方法1:直接写

表该建成什么样,这是数据库设计的话题,在此不说。现在的情况是,知道想把表建成什么样,问题是如何建。

最基本的方法就是“直接写”。新手刚上路时,通常会借助一本T-SQL入门书,后来便学会从联机丛书中查找具体的语法问题。经过这一阶段,建表语句的编写已然熟练。但问题是常常感到繁琐——编写建表语句的过程中经常有各种的重复。

方法2:在工具的辅助下写

以前发过一帖:“加速SQL代码输入的利器”,回复中大家提到了sql assistant和SQL Prompt,据说很好用,问题是收费的。

我习惯用AutoHotKey自定义快捷输入,建表相关的有这些:
[code=AutoHotKey]
:?:;ct::CREATE TABLE
:?:;at::ALTER TABLE
:?:;dt::DROP TABLE
:?:;tt::TRUNCATE TABLE
:?:;id::IDENTITY(1,1)
:?:;cstr::CONSTRAINT
:?:;pk::PRIMARY KEY CLUSTERED
:?:;uq::UNIQUE
:?:;fk::FOREIGN KEY
:?:;ref::REFERENCES
:?:;def::DEFAULT
:?:;ck::CHECK
:?:;n::NULL
:?:;nn::NOT NULL
[/code]
自己定义的配置总是最顺手的。习惯了这些快捷输入之后,手指就可以从这些关键字的敲打工作中解放出来,专注于字段名称和数据类型的选择。

就我而言,方法2已经满足了大多数情况下的建表需求。

方法3:自动生成代码

通常情况下,在规范化的系统设计中,表结构的设计不会直接以SQL代码的形式进行,而往往是关系图或表格形式的说明文档。这时候,图示或表格已经定义好了表结构的元数据,再手工翻译成SQL则是典型的重复工作,对于“懒惰的程序员”来说是不可忍受的。更好的选择是:自动生成代码。

多数的图形化数据库设计软件都提供了把设计好的图示模型生成SQL代码的功能。如果它们生成的代码不符合团队的编码规范,那就只能自己动手了。把模型文件导出为XML或其它纯文本格式,然后利用Python之类便于文本处理的高级语言编写一个小程序,根据团队的编码规范生成建表语句。
对于表格形式的说明文档也是同理,转成纯文本的元数据文件,然后进行Code Generation。

如果只是一次性的代码生成,用一款支持正则表达式替换的文本编辑器(如Vim/Emacs/EmEditor/Notepad++等)进行查找替换通常就可以生成主要的代码。正则表达式绝对是当之无愧的程序员必备工具,不了解的人可以看看这篇“正则表达式30分钟入门教程”。稍稍花点精力去学,“你值得拥有”。

如果代码生成需要多次进行,花点时间编写一个代码生成器就很有必要了。或许第一次编写和调试这个小程序的时间会跟手工翻译SQL的时间差不多,但第二次第三次就会大大方便。更重要的是,程序员不是电脑,程序员的时间和精力应该用来去做电脑做不了的事情,凡是电脑能做的就不要手工去做(像多变的需求、复杂的问题情境、人工审核之类,属于典型的电脑不能做的事情)。

Python、Perl、Tcl之类脚本语言非常适合用来做这个事情,原因是它们都是解释执行(至少直观上是这样),编写后可直接运行,并且很方便根据运行结果对代码进行调整。用C#开发一个稳定的二进制可执行文件也是OK的,但最好是考虑到各种情况并提供一组参数来方便灵活应对。

事实上,像正面这样的SQL语句,也是Code Generation的示例:
SQL code

SELECT sqlstr = 'INSERT INTO [table] VALUES('
    +CAST(col1 AS varchar(10))+','
    +CAST(col2 AS varchar(10))+')'
FROM [table]



可参看《程序员修炼之道》一书中19、20节的论述。


------解决方案--------------------

------解决方案--------------------
.........
------解决方案--------------------
小楼前辈的自动生成测试数据就很好用
------解决方案--------------------
回 收。
------解决方案--------------------
多种方法可以见表
1、利用sql server图形化可以见表。
2、也可以sql语句见表。
两者效果是等同的。
------解决方案--------------------
我現在建表基本上還是手工寫SQL語句
------解决方案--------------------
我用小楼的脚本
------解决方案--------------------
楼主牛人
------解决方案--------------------
手写SQL建表