INSERT 与 INSERT UPDATE into table 有许多 NOT NULL 约束列
INSERT vs INSERT UPDATE into table with many NOT NULL constraint columns
建议在 INSERT 语句中定义列名,例如:
INSERT INTO TableName(FirstColumn, SecondColumn, ThirdColumn,...) VALUES ('A','B','C',...);
但是如果 table 中有 10 多个列,这对查找列名和值之间的关系没有多大帮助。在这种情况下,最好将插入分为两部分(插入主键和更新其他字段):
INSERT INTO TableName(PKColumn) VALUES (12345);
UPDATE TableName SET FirstColumn = 'A', SecondColumn = 'B', ThirdColumn = 'C',...
WHERE PKColumn = 12345;
问题是 tables 有很多 NOT NULL 约束列,所以你必须在 INSERT 语句中定义它们,它变得不可读。有什么好的解决办法吗?
您不必定义 INSERT 中的所有列。
在不需要的列上严格限制是不好的做法。
最好为不需要的列或通常具有相同值的列定义默认值。
`QTY` int(11) DEFAULT '1',
`NUMBER` int(11) DEFAULT '0',
`PRICE` decimal(7,2) DEFAULT '0.00',
当我使用 INSERT 和 UPDATE 更新 table 时,我通常只同时执行这两项操作,而不是在执行插入操作之前检查记录是否存在。我做她 INSERT 然后按照 INSERT 和 UPDATE。
我可以检查 INSERT 是否重复:
if (mysql_errno() == 1062){$dups++;}
然后我检查 UPDATE 是否更新了任何内容。
if (mysql_affected_rows() > 0){$update++;}
我经常做的是对齐列名和值:
INSERT INTO TableName
(FirstColumn, SecondColumn, ThirdColumn, FourthColumn...)
VALUES
('A', 'B', 'C', 'D', ...);
这需要排很长的队,但随着目前宽屏显示器的发展趋势,这在当今并不是什么大问题(我认为)。
如果您需要经常这样做,您可能需要考虑编写一个可以传递命名参数的存储过程:
execute do_insert_tableX @FirstColumn = 'A', @SecondColumn = 'B', ...
如果您使用的是 SMSS,建议如下:
- 转到对象资源管理器。
- 扩展您的数据库,然后扩展其 tables。
- 右键单击要为其生成虚拟插入语句的 table。
- select 此选项:脚本 Table 为 > 插入到 > 新查询编辑器 Window。
- 它将创建一个虚拟插入语句,您只需从列表中删除不需要的列并填充值。
如果我的 table 中有这么多列,我就会这样做。
示例:
建议在 INSERT 语句中定义列名,例如:
INSERT INTO TableName(FirstColumn, SecondColumn, ThirdColumn,...) VALUES ('A','B','C',...);
但是如果 table 中有 10 多个列,这对查找列名和值之间的关系没有多大帮助。在这种情况下,最好将插入分为两部分(插入主键和更新其他字段):
INSERT INTO TableName(PKColumn) VALUES (12345);
UPDATE TableName SET FirstColumn = 'A', SecondColumn = 'B', ThirdColumn = 'C',...
WHERE PKColumn = 12345;
问题是 tables 有很多 NOT NULL 约束列,所以你必须在 INSERT 语句中定义它们,它变得不可读。有什么好的解决办法吗?
您不必定义 INSERT 中的所有列。
在不需要的列上严格限制是不好的做法。
最好为不需要的列或通常具有相同值的列定义默认值。
`QTY` int(11) DEFAULT '1',
`NUMBER` int(11) DEFAULT '0',
`PRICE` decimal(7,2) DEFAULT '0.00',
当我使用 INSERT 和 UPDATE 更新 table 时,我通常只同时执行这两项操作,而不是在执行插入操作之前检查记录是否存在。我做她 INSERT 然后按照 INSERT 和 UPDATE。
我可以检查 INSERT 是否重复:
if (mysql_errno() == 1062){$dups++;}
然后我检查 UPDATE 是否更新了任何内容。
if (mysql_affected_rows() > 0){$update++;}
我经常做的是对齐列名和值:
INSERT INTO TableName
(FirstColumn, SecondColumn, ThirdColumn, FourthColumn...)
VALUES
('A', 'B', 'C', 'D', ...);
这需要排很长的队,但随着目前宽屏显示器的发展趋势,这在当今并不是什么大问题(我认为)。
如果您需要经常这样做,您可能需要考虑编写一个可以传递命名参数的存储过程:
execute do_insert_tableX @FirstColumn = 'A', @SecondColumn = 'B', ...
如果您使用的是 SMSS,建议如下:
- 转到对象资源管理器。
- 扩展您的数据库,然后扩展其 tables。
- 右键单击要为其生成虚拟插入语句的 table。
- select 此选项:脚本 Table 为 > 插入到 > 新查询编辑器 Window。
- 它将创建一个虚拟插入语句,您只需从列表中删除不需要的列并填充值。
如果我的 table 中有这么多列,我就会这样做。
示例: