2017-10-21 97 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';