在INSERT语句中使用SQL子查询

时间:2015-05-05 21:05:18

标签: mysql sql database

以下是创建的两个表:

CREATE TABLE category_tbl(
id int NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
subcategory varchar(255) NOT NULL,
PRIMARY KEY(id),
CONSTRAINT nameSubcategory UNIQUE KEY(name, subcategory)
) ENGINE=InnoDB;

CREATE TABLE device(
id INT NOT NULL AUTO_INCREMENT,
cid INT DEFAULT NULL,
name VARCHAR(255) NOT NULL,
received DATE,
isbroken BOOLEAN,
PRIMARY KEY(id),
FOREIGN KEY(cid) REFERENCES category_tbl(id)
) ENGINE=InnoDB;

以下是给我的指示:

-- insert the following devices instances into the device table (you should use a subquery to set up foriegn keys referecnes, no hard coded numbers):
-- cid - reference to name: phone subcategory: maybe a tablet?
-- name - Samsung Atlas
-- received - 1/2/1970
-- isbroken - True

我在下面的insert语句中尝试在insert语句中使用子查询时遇到错误。你会如何解决这个问题?

INSERT INTO devices(cid, name, received, isbroken)
VALUES((SELECT id FROM category_tbl WHERE subcategory = 'tablet')  , 'Samsung Atlas', 1/2/1970, 'True');

2 个答案:

答案 0 :(得分:0)

SELECT语句中无法使用INSERT ... VALUES ...。这里的关键是VALUES关键字。(编辑:实际上可能,我很糟糕。)

如果您删除 VALUES 关键字,则可以使用INSERT语句声明的 INSERT ... SELECT ... 形式。

例如:

INSERT INTO mytable ( a, b, c) SELECT 'a','b','c'

在您的情况下,您可以运行一个返回所需外键列值的查询,例如

SELECT c.id
  FROM category_tbl c
 WHERE c.name = 'tablet'
 ORDER BY c.id
 LIMIT 1

如果我们在SELECT列表中添加一些文字,就像这样...

SELECT c.id              AS `cid`
     , 'Samsung Atlas'   AS `name`
     , '1970-01-02'      AS `received`
     , 'True'            AS `isBroken`
  FROM category_tbl c
 WHERE c.name = 'tablet'
 ORDER BY c.id
 LIMIT 1

这将返回我们可以插入的“行”。只需在SELECT前面加上

INSERT INTO device (`cid`, `name`, `received`, `isbroken`)

注意:SELECT返回的表达式与 position 列列表中的列“对齐”,而不是按名称排列。分配给SELECT列表中表达式的别名是任意的,它们基本上被忽略。它们可以省略,但我认为分配别名会使我们在运行SELECT部分​​时更容易理解。

答案 1 :(得分:0)

  1. 您在CREATE TABLEINSERT INTO中有不同的表名,因此只需选择一个devicedevices

  2. 当插入日期格式使用DATE('1970-02-01')

  3. 这样的好格式时
  4. 当插入布尔值时 - 只有TRUE没有qoutes我相信。

  5. http://sqlfiddle.com/#!9/b7180/1

    INSERT INTO devices(cid, name, received, isbroken)
    VALUES((SELECT id FROM category_tbl WHERE subcategory = 'tablet')  , 'Samsung Atlas', DATE('1970-02-01'), TRUE);