簡體   English   中英

在INSERT語句中使用SQL子查詢

[英]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部分​​時更容易理解。

  1. 你有不同的表名在CREATE TABLEINSERT INTO所以只選擇一個devicedevices

  2. 插入日期格式時,請使用DATE('1970-02-01')這樣的格式

  3. 當插入布爾值時-我相信沒有任何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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM