[英]Using SQL Sub-queries in an INSERT Statement
這是創建的兩個表:
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 INTO devices(cid, name, received, isbroken)
VALUES((SELECT id FROM category_tbl WHERE subcategory = 'tablet') , 'Samsung Atlas', 1/2/1970, 'True');
在
INSERT ... VALUES ...
語句中不能使用
SELECT
。
此處的關鍵是
(編輯:實際上是可能的,我不好。) 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返回的表達式將按位置 (而不是名稱)與列列表中的列“對齊”。 分配給SELECT
列表中的表達式的別名是任意的,它們基本上被忽略。 它們可以省略,但是我認為分配別名可以使我們僅運行SELECT部分時更容易理解。
你有不同的表名在CREATE TABLE
和INSERT INTO
所以只選擇一個device
或devices
插入日期格式時,請使用DATE('1970-02-01')
這樣的格式
當插入布爾值時-我相信沒有任何qoutes的TRUE
。
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.