INSERT与INSERT UPDATE进入具有许多NOT NULL约束列的表

时间:2015-01-22 07:19:21

标签: sql-server insert insert-update

建议在INSERT语句中定义列名,例如:

INSERT INTO TableName(FirstColumn, SecondColumn, ThirdColumn,...) VALUES ('A','B','C',...);

但如果表中有10列以上,那么找到列名和值之间的关系就无济于事了。在这种情况下,最好将插入分为两部分(插入主键和更新其他字段):

INSERT INTO TableName(PKColumn) VALUES (12345);
UPDATE TableName SET FirstColumn = 'A', SecondColumn = 'B', ThirdColumn = 'C',... 
WHERE PKColumn = 12345;

问题是对于具有大量NOT NULL约束列的表,因此您必须在INSERT语句中定义它们并且它变得不可读。有什么好的解决方案吗?

3 个答案:

答案 0 :(得分:0)

您无需在INSERT中定义所有列。

在不需要的栏目上施加严格限制是不好的做法。

为不需要或通常具有相同值的列定义默认值要好得多。

`QTY` int(11) DEFAULT '1',
`NUMBER` int(11) DEFAULT '0',
`PRICE` decimal(7,2) DEFAULT '0.00',

当我使用INSERT和UPDATE更新表时,我通常只执行这两个操作,而不是在执行插入之前检查记录是否存在。我是INSERT然后跟随INSERT和更新。

我可以检查INSERT是否有重复:

if (mysql_errno() == 1062){$dups++;}

我检查UPDATE是否更新了任何内容。

if (mysql_affected_rows() > 0){$update++;}

答案 1 :(得分:0)

我经常做的是对齐列名和值:

INSERT INTO TableName 
  (FirstColumn, SecondColumn, ThirdColumn, FourthColumn...) 
VALUES 
  ('A',         'B',          'C',         'D', ...);

这有很长的路线,但是对于宽屏显示器的当前趋势,现在这不是一个大问题(我认为)。

如果您需要经常这样做,您可能需要考虑编写存储过程,您可以在其中传递命名参数:

execute do_insert_tableX @FirstColumn = 'A', @SecondColumn = 'B', ...

答案 2 :(得分:0)

如果您使用的是SMSS,请参阅以下建议:

  1. 转到对象资源管理器。
  2. 展开数据库,然后展开其表格。
  3. 右键单击要为其生成虚拟插入语句的表。
  4. 选择此选项:脚本表格为> INSERT To>新查询编辑器窗口。
  5. 它将创建一个虚拟插入语句,您只需从列表中删除不需要的列并填充值。
  6. 如果我的表中有这么多列,我就会这样做。

    示例: Example