我正在下面的查詢:MySQL的INSERT INTO ... SELECT或默認值
INSERT INTO a (id, value) VALUES (_id, (SELECT value FROM b WHERE b.id = _id));
表一:ID,值(有默認值)
表B:ID,值
表b不包含所有請求的值。所以SELECT查詢有時會返回0行。在這種情況下,它應該使用a.value的默認值。
這是不是有可能?
編輯:在標記爲解決該職位的評論
解決方案空列。
我正在下面的查詢:MySQL的INSERT INTO ... SELECT或默認值
INSERT INTO a (id, value) VALUES (_id, (SELECT value FROM b WHERE b.id = _id));
表一:ID,值(有默認值)
表B:ID,值
表b不包含所有請求的值。所以SELECT查詢有時會返回0行。在這種情況下,它應該使用a.value的默認值。
這是不是有可能?
編輯:在標記爲解決該職位的評論
解決方案空列。
以下查詢可以使用。首先從表b查找_id的最大值(值)。它將是NULL或等於b.value。如果它是NULL(使用COALESCE函數進行檢查),則將表a的值列的默認值設置爲該值。
使用DEFAULT函數訪問表a的值列的缺省值(請參考參考文獻1)。
INSERT INTO a
SELECT
_id,
COALESCE(max(value), (SELECT DEFAULT(value) FROM a LIMIT 1)) value
FROM b
WHERE id = _id;
參考:
如果MySQL遵循其他RDBMS行爲,那麼只有當您甚至沒有指定字段時纔會選擇默認值。這意味着你需要兩個不同的INSERT語句:
IF (EXISTS(SELECT * FROM b WHERE id = _id)) THEN
INSERT INTO a (id, value) SELECT _id, value FROM b WHERE id = _id;
ELSE
INSERT INTO a (id) SELECT _id;
END IF;
,或者可能是這樣的......
INSERT INTO a (id, value) SELECT _id, value FROM b WHERE id = _id;
IF ((SELECT ROW_COUNT()) = 0) THEN
INSERT INTO a (id) SELECT _id;
END IF;
請注意,這是概念上的。我查了一下你的語法,但是我沒有在MySQL上測試過它。
這兩個示例都不起作用。/*第一個示例中沒有EXISTS函數,第二個函數不起作用,因爲即使SELECT查詢返回0行,INSERT查詢仍然成功。 – Gabscap
您可以在coalesce(max(value), default_value)
INSERT INTO a (id, value)
VALUES (_id, (SELECT coalesce(max(value), default_value)) FROM b WHERE b.id = _id));
我已經測試過,但解決方案並不完美。這適用於表a中有多行的情況。但不幸的是,情況並非總是如此。 :/如果表是空的,是否有可能進行查詢? – Gabscap
您的參考中的理論解決方案無法正常工作(解決方案本身):http://sqlfiddle.com/#!2/6fd73/1 – Gabscap
您是否想通過此查詢獲取默認值? SELECT COLUMN_DEFAULT FROM information_schema.columns WHERE TABLE_NAME ='a'AND COLUMN_NAME ='id'; –