建议在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语句中定义它们并且它变得不可读。有什么好的解决方案吗?
答案 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,请参阅以下建议:
如果我的表中有这么多列,我就会这样做。
示例: