2014-05-20 106 views
3

我正在下面的查詢: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的默認值。

這是不是有可能?

編輯:在標記爲解決該職位的評論

解決方案空列。

回答

0

以下查詢可以使用。首先從表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; 

SQL Fiddle demo

參考

  1. How to SELECT DEFAULT value of a field on SO
+0

我已經測試過,但解決方案並不完美。這適用於表a中有多行的情況。但不幸的是,情況並非總是如此。 :/如果表是空的,是否有可能進行查詢? – Gabscap

+0

您的參考中的理論解決方案無法正常工作(解決方案本身):http://sqlfiddle.com/#!2/6fd73/1 – Gabscap

+0

您是否想通過此查詢獲取默認值? SELECT COLUMN_DEFAULT FROM information_schema.columns WHERE TABLE_NAME ='a'AND COLUMN_NAME ='id'; –

0

如果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上測試過它。

+0

這兩個示例都不起作用。/*第一個示例中沒有EXISTS函數,第二個函數不起作用,因爲即使SELECT查詢返回0行,INSERT查詢仍然成功。 – Gabscap

1

您可以在coalesce(max(value), default_value)

包裹的價值
INSERT INTO a (id, value) 
VALUES (_id, (SELECT coalesce(max(value), default_value)) FROM b WHERE b.id = _id));