2017-01-11 1 views
1

В настоящее время я создал простую таблицу записей с идентификатором recordID в качестве первичного ключа с автоматическим приращением, вопрос в силу религиозных причин, мой работодатель НЕ ДЕЛАЕТ. число 4 и 6 в идентификаторе записи, поэтому вместо проверки идентификатора записи каждый раз после записи была ли гораздо более простой способ решить мою текущую проблему?Пропустить определенное число в auto-increment mysql

EDIT:

Вот быстрый стол тест, который я создал на основе ответа Vanojx1 в. Так что же я сделал не так?

CREATE TABLE `test` (
    `ID` int(11) NOT NULL, 
    `value` int(11) NOT NULL 
) 

DELIMITER $$ 
CREATE TRIGGER `jump4and6` BEFORE INSERT ON `test` FOR EACH ROW BEGIN 
    SET @nextId = (SELECT MAX(`id`) FROM `test`); 
    IF (@nextId IN (4,6)) THEN 
     SET NEW.id = @nextId + 1; 
     SET @nextId = @nextId + 2; 
    ELSE 
     SET NEW.id = @nextId; 
     SET @nextId = @nextId + 1; 
    END IF; 
    INSERT INTO `test`(`id`) VALUES (@nextId); 
    END 
$$ 
DELIMITER ; 

ALTER TABLE `test` ADD PRIMARY KEY (`ID`); 
ALTER TABLE `test` MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT; 

Все работает до сих пор, но когда я попытался вставить строку:

INSERT INTO `test`(value) VALUES (123456); 

Это происходит.

#1442 - Can't update table 'test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 
+0

автоинкрементируемых всегда будет увеличивать идентификатор записи при создании списка. поэтому вы можете вставлять и удалять эти строки, но вы не можете пропустить автоуровень в/или перед созданием. –

+0

Это действительно интересно. Я не знаю никакой такой функции и хотел бы следовать этой теме. Единственный тигр, о котором я могу думать, - это проверить идентификатор последней вставленной строки, а если следующий 4 || 6, то просто вставьте строку FOO и немедленно удалите ее, чтобы сохранить пространство DB. По информационным причинам я также хотел бы знать, к какой религии обращаются здесь, и к отношениям с этими цифрами, если вы не возражаете. –

+0

@RuslanAbuzant Я кодирую медицинскую карту, номер 4 на китайском языке имеет похожий звук с «Смертью» (следовательно, медицинские здания часто пропускают номер 4), а для 6 - более христианский, из-за ссылки 666 для сатаны. –

ответ

-2

Вы можете создать первичный ключ как целое, а затем использовать триггер перед тем вставку, как это:

DELIMITER $$ 
CREATE TRIGGER jump4and6 
BEFORE INSERT 
ON your_table 
    FOR EACH ROW BEGIN 
    SET @nextId = (SELECT MAX(current_index) FROM your_table_sequence); 
    IF (@nextId IN (4,6)) THEN 
     SET NEW.id = @nextId + 1; 
     SET @nextId = @nextId + 2; 
    ELSE 
     SET NEW.id = @nextId; 
     SET @nextId = @nextId + 1; 
    END IF; 
    INSERT INTO your_table_sequence (current_index) VALUES (@nextId); 
END$$ 

Вы также нужна таблица для хранения первичного ключа последовательности

+0

Хм, похоже, это работает, но что, если, скажем, текущий ID = 39, следующий идентификатор станет 40, но в соответствии со сценарием он просто сделает это 41, что все еще не удается из-за того, что в ID нет: = –

+0

Нет, «все, что отличается от 4 и 6» IN (4,6), будет return false. id должен быть целым числом – Vanojx1

+0

Хорошо, я пробовал ваш метод, но что-то пошло не так. Пожалуйста, проверьте почту снова, и помогите мне определить, где пошло не так? Спасибо –

Смежные вопросы