Значение по умолчанию MySQL как значение другого поля - PullRequest
12 голосов
/ 17 июня 2011

Могу ли я и, если могу, как установить значение по умолчанию для поля в таблице MySQL равным значению другого поля?

Дело в том, что у меня есть данные, и у каждого объекта данных есть свой идентификатор в таблице. Но мне бы хотелось иметь возможность переупорядочивать данные, изменяя их индекс сортировки, не меняя их ID. Таким образом, для поля sort_num по умолчанию должно быть установлено значение, заданное для индексированного поля с автоинкрементом ID.

Заранее спасибо!

Ответы [ 2 ]

8 голосов
/ 17 июня 2011

Я вижу два возможных решения для этого:

1. Возможность:

Вы используете функцию, чтобы просто игнорировать sort_num, если она не установлена:

`SELECT * FROM mytable ORDER BY coalesce(sort_num, id)`

coalesce() возвращает первое ненулевое значение, поэтому вы должны вставить значения для sort_num, если вам действительно нужно изменить порядок элементов.

2. Возможность:

Вы пишете триггер, который автоматически устанавливает значение, если оно не установлено в операторе вставки:

DELIMITER //

CREATE TRIGGER sort_num_trigger
BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
    DECLARE auto_inc INT;
    IF (NEW.sort_num  is null) THEN
         -- determine next auto_increment value
        SELECT AUTO_INCREMENT INTO auto_inc FROM information_schema.TABLES
        WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME = 'mytable';
        -- and set the sort value to the same as the PK
        SET NEW.sort_num = auto_inc;
    END IF;
END
//

(вдохновлено этим комментарием )

Однако это может привести к проблемам с распараллеливанием (одновременная вставка нескольких запросов)

4 голосов
/ 17 июня 2011

Плохо было бы переставлять столбец с автоинкрементом, поэтому лучше было бы

Добавить столбец sort_num в таблицу

ALTER TABLE data ADD sort_num column-definition; (column definition same as ID)

UPDATE data SET sort_num = ID

Теперь поиграйте со столбцом sort_numне влияет на идентификатор столбца

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...