2014-01-20 3 views
9

Я пытаюсь обновить значение столбца из другого столбца в одном и том же элементе tabl, но это не с "ERROR 1093 (HY000): вы не можете указать целевую таблица 'tab_1' для обновления в ЕКОМ "обновить столбец с производным значением из другого столбца в mysql

Что я имею в Mysql

DT;     date_custom 
2012-10-31 17:00:22; 0 
2012-09-31 17:00:21; 0 
2012-07-31 17:00:25; 0 
2012-10-31 17:43:56; 0 
2012-11-31 17:44:09; 0 

, что мне нужно в соответствующем date_custom поле (столбец)

2012-10-31 
2012-09-31 
2012-07-31 
2012-10-31 
2012-11-31 

другими словами, я просто хочу Mys ql, чтобы подобрать соответствующую строку для столбца DT и просто DUMP производное значение date_column. Это должно быть одноразовым. У меня есть комбинация ключей, которые однозначно идентифицируют строку, но я не хочу ее использовать, если я могу это идентифицировать.

Вот что я пробовал и не работал.

Before this I created this column - date_custom as below -: 
alter table tab_1 
add column date_custom int not null; 

# simplistic 
UPDATE tab_1 SET date_custom = (SELECT SUBSTRING_INDEX(DT," " ,1) FROM tab_1); 

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

# using self joins on subquery 
UPDATE tab_1 
SET tab_1.date_custom = 
(
    SELECT SUBSTRING_INDEX(a.DT," " ,1) 
    FROM tab_1 a 
    INNER JOIN tab_1 b on 
    a.DT = b.DT and a.AUCTION_ID_64=b.AUCTION_ID_64 # these 2 columns together make up the primary key, but I would like to avoid using this if possible 
) # does not work 

Это соответствует теме здесь You can't specify target table for update in FROM clause

** Из официальной документации -. «В общем, вы не можете изменять таблицу и выбрать из тех же таблиц в подзапросе, например, относится это ограничение заявлениям следующих форм:»**

DELETE FROM t WHERE ... (SELECT ... FROM t ...); 
UPDATE t ... WHERE col = (SELECT ... FROM t ...); 
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...); 

Exception: The preceding prohibition does not apply if you are using a subquery for the modified table in the FROM clause. Example: 
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...); 
+0

Быстрый способ использования, чтобы получить дату, вместо substring_index выберите extract (минута от timestamp '2009-09-09 12:08:43'); , в то же время используя self-соединения и т. д. – ekta

ответ

14

Используйте автообъединение, как это:

UPDATE test t1, test t2 
SET t1.date_custom = SUBSTRING_INDEX(t2.dt," " ,1) 
WHERE t1.id = t2.id 

Рабочий демонстрационный пример: http://sqlfiddle.com/#!2/9b71cb/1/0

+0

Не работает :(ERROR 1242 (21000): Подзапрос возвращает более 1 строки – ekta

+0

@ekta Я изменил свой ответ выше, теперь в запросе используется SELF JOIN вместо подзапросов. добавила ссылку на sql скрипт для рабочей демонстрации. Вы можете попробовать обновленный запрос. –

+0

Да, я только что заметил это и выполнил ваш новый запрос выше - вот что я сейчас вижу - «ERROR 1265 (01000): данные усечены для столбца ' date_custom 'в строке 1 "Я также расширил предложение where, чтобы включить все возможные идентификаторы, которые однозначно составляют строку. Что я делаю неправильно? UPDATE tab_1 t1, tab_1 t2 SET t1.date_custom = SUBSTRING_INDEX (t2.DT," " , 1) WHERE t1.DT = t2.DT и t1.AUCTION_ID_64 = t2.AUCTION_ID_64 и t1.USER_ID_64 = t2.USER_ID_64; – ekta

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