以下是创建的两个表:
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');
答案 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)
您在CREATE TABLE
和INSERT INTO
中有不同的表名,因此只需选择一个device
或devices
当插入日期格式使用DATE('1970-02-01')
当插入布尔值时 - 只有TRUE
没有qoutes我相信。
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);