2013-07-26 5 views
1

У меня есть столбец ID автоматического приращения и для некоторой ситуации я хотел другой столбец быть равен первичным ключ + 1 значениеMySQL вставка со значением равной первичного ключа +-

ID | other 
1 | 2 
2 | 3 
3 | 4 
4 | 123 (some situation, it is not always plus 1) 

Как могу ли я достичь этого?

Вот что я пытался

INSERT INTO table (`ID`,`other`) VALUES ('',(SELECT MAX(ID)+1 FROM table)) 

Но это возвращает ошибку

You can't specify target table 'table' for update in FROM clause 
+0

Первого правила спрашивать здесь - показать нам свой код и что вы попытался добиться этого сам. –

+0

вы можете использовать триггер на этой таблице. обновить «другой» столбец после вставки обновления данных tablename set other = ID + 1 –

+1

Если это всегда будет ID + 1, зачем он должен быть отдельным столбцом? Вы можете использовать его в запросах, ссылаясь на «id + 1», например SELECT id + 1 AS other from ; –

ответ

0

Try Ниже запроса:

ALTER TABLE dbo.table ADD 
Column AS ([ID]+1) 
GO 

Это, безусловно, работать

+0

это НЕ всегда будет ID + 1 –

+0

Как бы то ни было .. мы просто нужно поставить расчет. Например, Столбец AS '([ID] +1) * 10' Или вы можете использовать Case также ' ALTER TABLE dbo.tblNNN ADD Другое3 AS ID случая, когда 1, затем [ID] + 1 else [ID] +2 end GO' –

+0

@NitinChaurasia Вы говорите о сервере SQL, вопрос в том, что MySQL, который не (afaik еще) вычислил столбец поддержка. –

0

Используя нормальный AUTO_INCREMENT столбец как id, я не могу придумать способ сделать это в MySQL. Триггеры, которые в противном случае были бы опцией, не работают с колонками AUTO_INCREMENT.

Единственный способ, который я вижу, - сделать две команды для INSERT;

INSERT INTO bop (value) VALUES ('These values should be 1 and 2'); 
UPDATE bop SET other = id+1 WHERE id = LAST_INSERT_ID(); 

An SQLfiddle to test with.

Ближайшее я получаю от того, что вы ищете, чтобы генерировать последовательности отдельно от AUTO_INCREMENT с использованием функции и использовать вместо этого для генерации идентификатора таблицы;

DELIMITER // 

CREATE TABLE bop (
    id INT UNIQUE, 
    other INT, 
    value VARCHAR(64) 
)// 

CREATE TABLE bop_seq (seq INT) // -- Sequence table 
INSERT INTO bop_seq VALUES (1) // -- Start value 

CREATE FUNCTION bop_nextval() RETURNS int 
BEGIN 
    SET @tmp = (SELECT seq FROM bop_seq FOR UPDATE); 
    UPDATE bop_seq SET seq = seq + 1; 
    RETURN @tmp; 
END// 

CREATE TRIGGER bop_auto BEFORE INSERT ON bop 
FOR EACH ROW 
    SET NEW.id = bop_nextval(), NEW.other=NEW.id + 1; 
// 

Это позволит вам делать вставки и иметь его как автономер, как вы хотите. FOR UPDATE должен сохранять транзакцию последовательности в безопасности, но я не тестировал нагрузку, поэтому вы можете это сделать.

Another SQLfiddle.

+0

yup, я уже думал об этом. Но я хочу найти запрос, который не нужно выполнять дважды. Спасибо, кстати! –

+0

@ ivory-santos Я не могу придумать другой способ сделать это, но вы должны иметь возможность отправлять оба запроса в одну и ту же партию, чтобы они не приводили к двум отдельным обратным переходам в базу данных. –

+0

@ ivory-santos Обновлено с помощью триггерного решения, которое может делать то, что вы хотите. –

0

Я решил эту проблему путем обновления 2 раза DB ..

Я хотел сделать +1 от 19 до ..

UPDATE `table` SET `id`=`id`+101 WHERE id <= 19 
UPDATE `table` SET `id`=`id`-100 WHERE id <= 119 AND id >= 101 
Смежные вопросы