2017-06-23 1 views
0

J'ai clé étrangère dans une table, les références sur une autre table, pas null. Comment puis-je sélectionner la valeur par défaut pour cela? Quelque chose comme ceci:MySQL sélectionnez la valeur par défaut

ALTER TABLE table_a MODIFY COLUMN not_null_column BIGINT NOT NULL DEFAULT 
    (SELECT id FROM table_b WHERE name_field = 'some name'); 

Ou ceci:

SET @defaultValue = (SELECT id FROM table_b WHERE name_field = 'some name'); 
ALTER TABLE table_a MODIFY COLUMN not_null_column BIGINT NOT NULL DEFAULT @defaultValue; 
+1

Copie possible de [valeur par défaut du champ set mysql vers une autre colonne] (https://stackoverflow.com/questions/15384429/mysql-set-field-default-value-to-other-column) –

+2

hmm, je pense Je voulais vraiment dire celui-ci: [MySQL: valeur par défaut de la colonne d'une autre colonne de table] (https://stackoverflow.com/questions/41102020/mysql-default-value-of-column-from-another-table-column) il semble que le premier indique la vraie réponse tout aussi bien: cela ne peut pas être fait. –

+0

Oui, c'est ça. Je vous remercie. N'a pas pensé qu'il est impossible de définir une fonction ou une expression comme valeur par défaut, donc, ignoré cette question lors de la recherche. – Squeez

Répondre

0

Une option consiste à utiliser 13.5 Prepared SQL Statement Syntax.

mysql> DROP TABLE IF EXISTS `table_b`, `table_a`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `table_a` (
    -> `not_null_column` VARCHAR(20) 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `table_b` (
    -> `name_field` VARCHAR(255) NOT NULL, 
    -> `value` VARCHAR(255) NOT NULL 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO `table_b` 
    -> (`name_field`, `value`) 
    -> VALUES 
    -> ('some name', '5'); 
Query OK, 1 row affected (0.00 sec) 

mysql> DESC `table_a`; 
+-----------------+-------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+-----------------+-------------+------+-----+---------+-------+ 
| not_null_column | varchar(20) | YES |  | NULL |  | 
+-----------------+-------------+------+-----+---------+-------+ 
1 row in set (0.00 sec) 

mysql> SET @`stmt` := CONCAT('ALTER TABLE `table_a` 
    '>      MODIFY COLUMN `not_null_column` BIGINT NOT NULL 
    '>      DEFAULT ', (SELECT `value` 
    ->         FROM `table_b` 
    ->         WHERE `name_field` = 'some name')); 
Query OK, 0 rows affected (0.01 sec) 

mysql> SELECT @`stmt`; 
+-------------------------------------------------------------------------------------------------------------------------------+ 
| @`stmt`                              | 
+-------------------------------------------------------------------------------------------------------------------------------+ 
| ALTER TABLE `table_a` 
         MODIFY COLUMN `not_null_column` BIGINT NOT NULL 
         DEFAULT 5 | 
+-------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> PREPARE `stmt` FROM @`stmt`; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

mysql> EXECUTE `stmt`; 
Query OK, 0 rows affected (0.00 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> DEALLOCATE PREPARE `stmt`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> DESC `table_a`; 
+-----------------+------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+-----------------+------------+------+-----+---------+-------+ 
| not_null_column | bigint(20) | NO |  | 5  |  | 
+-----------------+------------+------+-----+---------+-------+ 
1 row in set (0.00 sec) 

Exemple db-fiddle.