2015-05-23 1 views
0

Iam, работающий на MYSQL и нуждающийся в хранимой процедуре, которая будет проходить через таблицу A, которая имеет 100 столбцов и 50 000+ строк и для всех значений Null, найденных в таблице, SP обновит ее с пустыми значениями.Пройдите через таблицу и обновите столбцы с нулевыми значениями

например Таблица UPDATE A SET column1 = '' где column1 IS NULL; column1 - это смесь нулевых и заполненных и пустых строк, но я хочу обновить только нулевые строки.

Я не хочу жестко указывать имена столбцов. Нужно брать столбцы один за другим в самой хранимой процедуре. Возможно ли это?

ответ

0

Вы можете динамически извлекать имена столбцов из ваших таблиц.

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'my_table'; 

И объедините это, используя внутренние запросы.

+0

некоторые из моих столбцов имеют тип данных как int ... могут ли такие столбцы быть пустыми, где есть нуль –

0

Используйте функцию mysql ifnull. Вам понадобится нижняя строка для всех сотен столбцов. Это можно использовать в строках/char, а также в целых полях.

update table 
set 
field1=ifnull(field1, " "), 
field2=ifnull(field2, " "), 
field3=ifnull(field3, 0), 
field4=ifnull(field4, "").... 

Если вы не хотите, чтобы жёстко имена столбцов, вы можете построить выше запрос как на другой ответ:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'my_table'; 

Для каждого из приведенных выше строк, построить каскадный оператор обновления ,

DEClARE usercursor CURSOR FOR 
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'my_table'; 

declare updatesql varchar(3000); 

set updatesql = "update TABLE set "; 

OPEN usercursor 
get_users:LOOP 
FETCH usercursor into v_username; 

set updatesql = concat(v_username,"=ifnull(",updatesql) 
set updatesql = concat(v_username,",' '),",updatesql) 

END LOOP get_users 
Смежные вопросы