2015-01-29 5 views
1

У меня есть база данных MySQL с несколькими сотнями таблиц.SQL - удалять строки во всех таблицах на основе значения столбца

Мне нужно удалить записи во всех таблицах на основе общего столбца с именем «companyId» - этот столбец присутствует во всех таблицах базы данных.

Как я могу удалить все записи во всех таблицах, где columnId = somenumber?

Спасибо заранее!

Ивано С.

@SocratesG Я попробовал хранимую процедуру, но я получаю ниже создания СП:

ОШИБКА 1064: У вас ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса, используемого рядом с '@TableName VARCHAR (128);

DECLARE @MyColumn VARCHAR (128);

SET @MyColumn = 'Компан' в строке 4

SQL-Заявление:

CREATE PROCEDURE (deletePortalInstance)

НАЧАТЬ

DECLARE @TableName VARCHAR (128);

DECLARE @MyColumn VARCHAR (128);

SET @MyColumn = '' CompanyID

DECLARE MyCursor КУРСОРОМ ДЛЯ

(SELECT object_name (с.идентификатор), как ObjectName

  FROM dbo.syscolumns c 

      WHERE 

      OBJECTPROPERTY(c.id,'ISTABLE') = 1 --Search for tables only 

      AND c.name = @MyColumn) 

ОТКРЫТЫЙ MyCursor

FETCH СЛЕДУЮЩИЙ ИЗ MyCursor в @TableName

ПРИ @@ FETCH_STATUS = 0

НАЧАТЬ

EXEC 

     (

      'DELETE ' + @MyColumn 

      +' FROM ' + @TableName 

      +' WHERE ' + @MyColumn + ' = 906454' 

     ) 

FETCH NEXT FROM MyCursor into @TableName 

КОНЕЦ

ЗАКРЫТЬ MyCursor

DEALLOCATE MyCursor

END

ОШИБКА 1064: У вас ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса, используемого рядом с '@TableName VARCHAR (128);

DECLARE @MyColumn VARCHAR (128);

SET @MyColumn = 'Компан' в строке 4

SQL-Заявление:

CREATE PROCEDURE (deletePortalInstance)

НАЧАТЬ

DECLARE @TableName VARCHAR (128);

DECLARE @MyColumn VARCHAR (128);

SET @MyColumn = '' CompanyID

DECLARE MyCursor КУРСОРОМ ДЛЯ

(SELECT object_name (с.идентификатор), как ObjectName

  FROM dbo.syscolumns c 

      WHERE 

      OBJECTPROPERTY(c.id,'ISTABLE') = 1 --Search for tables only 

      AND c.name = @MyColumn) 

ОТКРЫТЫЙ MyCursor

FETCH СЛЕДУЮЩИЙ ИЗ MyCursor в @TableName

ПРИ @@ FETCH_STATUS = 0

НАЧАТЬ

EXEC 

     (

      'DELETE ' + @MyColumn 

      +' FROM ' + @TableName 

      +' WHERE ' + @MyColumn + ' = 906454' 

     ) 

FETCH NEXT FROM MyCursor into @TableName 

КОНЕЦ

ЗАКРЫТЬ MyCursor

DEALLOCATE MyCursor

END

+2

Настройте таблицы с помощью соответствующих внешних ключей! – jarlh

ответ

0
DELETE FROM companyId where columnId = 1 
+0

У меня есть база данных MySQL с некоторыми таблицами HUNDREDS, поэтому мне нужно удалить записи во всех таблицах на основе общего столбца с именем «companyId» с процессом BATCH, а не таблицы по таблице – icarrara

0
DELETE FROM <tblName> where columnId = <Your Column Id val> 

Но я думаю, что вы используете ограничение ссылочной целостности с помощью внешних ключей и использовать На Delete Cascade

В соответствии с вашим новым info,

Update:

DELETE t1, t2 
     FROM <table1> t1 
     JOIN <table2> t2 ON t1.columnId = t2.columnId 
    WHERE t1.columnId = <Your Column Value> 

Объяснение:

  1. Здесь мы удаление записей из нескольких таблиц, поэтому мы используем DELETE FROM table1,table2 и т.д.

  2. Как у вас есть один столбец с таким же именем во всех таблицы, мы сделали JOIN, поэтому все строки из 100 таблиц можно удалить сразу.

3.At в прошлом мы имеем условие, как WHERE t1.columnId = 1, значит в table1, проверьте columnId = 1, так как мы присоединились, он выбирает все такие строки в таблице 100, а затем удаляет его.

+0

У меня есть база данных MySQL с некоторыми таблицами HUNDREDS, поэтому мне нужно для удаления записей во всех таблицах на основе общего столбца с именем «companyId» с процессом BATCH, а не таблицы по таблице – icarrara

+0

«общий столбец с именем« companyId »? Является ли это имя столбца одинаковым в 100 таблицах? –

+0

Да, у меня есть несколько таблиц HUNDREDS, и во всех таблицах есть столбец с именем «companyId» – icarrara

0
DELETE FROM table_Name where columnn_name = value ; 

пример

DELETE fom students where rll_num = 5 ; 
+0

У меня есть база данных MySQL с некоторыми таблицами HUNDREDS, поэтому мне нужно удалить записи во всех таблицах на основе общего столбца с именем «companyId» с процессом BATCH, а не таблицы по таблице – icarrara

0

Вы можете попробовать это

DECLARE @TableName VARCHAR(128); 
DECLARE @MyColumn VARCHAR(128); 
SET @MyColumn = 'MyColumnName' 
DECLARE MyCursor CURSOR FOR 
(SELECT OBJECT_NAME(c.id) as ObjectName 
       FROM dbo.syscolumns c 
       WHERE 
       OBJECTPROPERTY(c.id,'ISTABLE') = 1 --Search for tables only 
       AND c.name = @MyColumn) 

OPEN MyCursor 
FETCH NEXT FROM MyCursor into @TableName 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC 
      (
       'DELETE ' + @MyColumn 
       +' FROM ' + @TableName 
       +' WHERE ' + @MyColumn + ' <= 1000' 
      ) 
    FETCH NEXT FROM MyCursor into @TableName 
END 
CLOSE MyCursor 
DEALLOCATE MyCursor 
+0

. Я попробую, но что означает « <= 1000 '? – icarrara

+0

вы можете использовать свое значение там – SocratesG

+0

Вы имеете в виду значение, соответствующее записям, которые я хочу удалить? – icarrara

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