这个问题关系到SQL,特别是SQLite的实现。
我创建了一个数据库。在此数据库中有一个名为“Items”的表。它有以下字段:
所有类型都是varchar(255),除了Price,它是数字(10,2)
现在是问题的核心:
以下陈述之间有什么区别?第二个陈述是如何适当使用的?
1. insert into items values (7340011403777, upper("orange soda"), 10.90, "Consumable");
2. insert into items values (7340011403777, upper("orange soda"), 10.90, Consumable);
第一个语句执行预期的操作:将元组添加到数据库中(正确的措辞(元组)?)。
在第二个版本中,它声明:
错误:没有这样的列:耗材
这是否意味着有一种方法可以从这里的某个地方指定一个列?如果定义了,这样的语法将如何工作?这是一般标准化的SQL吗?
答案 0 :(得分:1)
不,在这种情况下,没有标准方法可以命名表或表表达式来获取VALUES
中命名的列。
您收到消息的原因是VALUES
将多个表达式作为参数,而表达式中的不带引号的名称通常会解析为列名。由于无法在任何地方找到列名,因此您会收到错误消息。
要使用其他表格中的列名称插入值,您不能使用值子句,但可以直接从SELECT
插入
INSERT INTO dest SELECT id, value*2 FROM source;
作为旁注,字符串文字应该是单引号,否则SQLite将尝试在使用字符串本身之前找到带引号名称的列名,这可能会产生奇怪的结果;
An SQLfiddle showing the effect。请注意,第一个选择使用双引号,因此它会将列value
与自身进行比较,得出错误的结果,而单引号版本会将列value
与字符串'value'
进行比较,给出正确的结果。
答案 1 :(得分:0)
这是标准的SQL语法错误。列类型是Varchar(255)。因此,它期望一个字符串值。
查询:
2. insert into items values (7340011403777, upper("orange soda"), 10.90, Consumable);
表示耗材是一列数据库对象,而不是字符串文字。
字符串文字应始终引用为“消耗品”。