2017-10-21 95 views
0

MySQL新手在這裏。我已經構建了一個包含環境變量的數據庫。每個值都與唯一的classdesignationvariable相關聯,每個值都有一個定義表。當我添加一個新變量時,我需要將每個定義表中的外鍵複製到一個新表中,並且添加一個值variable_mappings。該variable_mappings表看起來像這樣:插入到選擇mysql中

+----------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+----------------+--------------+------+-----+---------+----------------+ 
| id    | int(11)  | NO | PRI | NULL | auto_increment | 
| value   | varchar(512) | NO |  | NULL |    | 
| designation_id | int(11)  | NO | MUL | NULL |    | 
| class_id  | int(11)  | NO | MUL | NULL |    | 
| variable_id | int(11)  | NO | MUL | NULL |    | 
+----------------+--------------+------+-----+---------+----------------+ 

眼下命令添加變量看起來是這樣的:

INSERT INTO variable_mappings (variable_id, designation_id, class_id, value) 
    SELECT variable_definitions.id as 'variable', 
      designation_definitions.id as 'designation', 
      class_definitions.id as 'class' 
    FROM variable_definitions 
    JOIN designation_definitions on designation_definitions.name='development' 
    JOIN class_definitions on class_definitions.name='av-control' 
    WHERE variable_definitions.name='CONFIGURATION-DATABASE-MICROSERVICE-ADDRESS'; 

MySQL的抱怨,有一個爲value沒有默認值。添加一行到variable_mappings的最佳方式是什麼?

回答

0

嘗試從INSERT語句列列表中刪除值:

INSERT INTO variable_mappings (variable_id, designation_id, class_id) 
SELECT variable_definitions.id as 'variable', 
     designation_definitions.id as 'designation', 
     class_definitions.id as 'class' 
FROM variable_definitions 
JOIN designation_definitions on designation_definitions.name='development' 
JOIN class_definitions on class_definitions.name='av-control' 
WHERE variable_definitions.name='CONFIGURATION-DATABASE-MICROSERVICE-ADDRESS'; 

或在SELECT語句中添加一個字段

INSERT INTO variable_mappings (variable_id, designation_id, class_id, value) 
SELECT variable_definitions.id as 'variable', 
     designation_definitions.id as 'designation', 
     class_definitions.id as 'class', 
     blablabla as 'value' 
FROM variable_definitions 
JOIN designation_definitions on designation_definitions.name='development' 
JOIN class_definitions on class_definitions.name='av-control' 
WHERE variable_definitions.name='CONFIGURATION-DATABASE-MICROSERVICE-ADDRESS'; 
0

INSERT INTO SELECT聲明要求SELECT語句返回相同數量的列作爲括號中的列數。在你的情況下,你要求MySQL插入4列,但你的SELECT語句只返回3列。一個快速的方法去解決,這是在你的SELECT添加NULL像這樣:

INSERT INTO variable_mappings (variable_id, designation_id, class_id, value) 
SELECT variable_definitions.id as 'variable', 
     designation_definitions.id as 'designation', 
     class_definitions.id as 'class', 
     NULL /* default value for the 'value' column */ 
FROM variable_definitions 
JOIN designation_definitions on designation_definitions.name='development' 
JOIN class_definitions on class_definitions.name='av-control' 
WHERE variable_definitions.name='CONFIGURATION-DATABASE-MICROSERVICE-ADDRESS'; 

的另一種方法是簡單地從插入到列的列表中刪除value。由於該列在DDL中的默認值爲NULL,因此它將設置爲該值。

INSERT INTO variable_mappings (variable_id, designation_id, class_id) 
SELECT variable_definitions.id as 'variable', 
     designation_definitions.id as 'designation', 
     class_definitions.id as 'class' 
FROM variable_definitions 
JOIN designation_definitions on designation_definitions.name='development' 
JOIN class_definitions on class_definitions.name='av-control' 
WHERE variable_definitions.name='CONFIGURATION-DATABASE-MICROSERVICE-ADDRESS';