SQLite对非字符条目的响应

时间:2014-07-16 06:12:17

标签: sql sqlite

这个问题关系到SQL,特别是SQLite的实现。

我创建了一个数据库。在此数据库中有一个名为“Items”的表。它有以下字段:

  • PLU / EAN
  • 名称
  • 价格
  • 类型

所有类型都是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吗?

2 个答案:

答案 0 :(得分:1)

不,在这种情况下,没有标准方法可以命名表或表表达式来获取VALUES中命名的列。

您收到消息的原因是VALUES将多个表达式作为参数,而表达式中的不带引号的名称通常会解析为列名。由于无法在任何地方找到列名,因此您会收到错误消息。

要使用其他表格中的列名称插入值,您不能使用值子句,但可以直接从SELECT插入

INSERT INTO dest SELECT id, value*2 FROM source;

An SQLfiddle to test with

作为旁注,字符串文字应该是单引号,否则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);

表示耗材是一列数据库对象,而不是字符串文字。

字符串文字应始终引用为“消耗品”。