Torakami Ответов: 3

Как удалить все справочные данные из всех таблиц в одном запросе


Привет ,

У меня есть одна таблица продуктов . Во многих таблицах есть много внешних ключей, соответствующих productid.

То, что я хочу удалить определенные продукты из моей таблицы продуктов, но в то же время я хочу удалить там ссылки и из других таблиц, если эти данные идентификаторов доступны в любой из этих таблиц . У меня нет никакого каскада, доступного для любого из моих внешних ключей

пожалуйста, предложите

Что я уже пробовал:

Я пытался сделать что-то вроде этого

DELETE a.*, b.* 
FROM messages a 
LEFT JOIN usersmessages b 
ON b.messageid = a.messageid 
WHERE a.messageid = 1


но есть много таблиц, и я не нашел этот путь правильным

3 Ответов

Рейтинг:
2

OriginalGriff

Команда SQL DELETE может удалять только из одной таблицы, поэтому вам нужно сначала удалить все записи из ваших подтаблиц, а затем из главной таблицы, используя несколько команд удаления. Я бы предложил создать хранимую процедуру, которая устанавливает транзакцию, а затем выполняет удаление в правильном порядке перед фиксацией.

Вот почему каскад существует: чтобы вам не пришлось этого делать!


Torakami

начать транзакцию;

объявить @таблица deletedIds ("кодтовара" инт );

вставить в @deletedIds
выберите P.идентификатор товара от П
где p. ProductID = 131

удалить кл.
от CallLine as cl
присоединяйтесь к @deletedIds как d
на D.кодтовара = сл.Кодтовара

удалить dl
от DivisionToProduct as dl
присоединяйтесь к @deletedIds как d
на D.кодтовара = дл.Кодтовара

совершению сделки;

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

Рейтинг:
1

manu_dhobale

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

EXEC sp_fkeys 'tableName'

если ваше название продукта хранится в другой таблице со строковым значением вместо первичного ключа
вы можете найти всю таблицу: столбец из базы данных по нижеприведенному запросу
--DROP table #Results

 DECLARE @SearchStr nvarchar(100)='productName'
 
 
 CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
 DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
	SET  @TableName = ''
	SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

	WHILE @TableName IS NOT NULL
	BEGIN
		SET @ColumnName = ''
		SET @TableName = 
		(
			SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
			FROM 	INFORMATION_SCHEMA.TABLES
			WHERE 		TABLE_TYPE = 'BASE TABLE'
				AND	QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
				AND	OBJECTPROPERTY(
						OBJECT_ID(
							QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
							 ), 'IsMSShipped'
						       ) = 0
		)

		WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
		BEGIN
			SET @ColumnName =
			(
				SELECT MIN(QUOTENAME(COLUMN_NAME))
				FROM 	INFORMATION_SCHEMA.COLUMNS
				WHERE 		TABLE_SCHEMA	= PARSENAME(@TableName, 2)
					AND	TABLE_NAME	= PARSENAME(@TableName, 1)
					AND	DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
					AND	QUOTENAME(COLUMN_NAME) > @ColumnName
			)
	
			IF @ColumnName IS NOT NULL
			BEGIN
				INSERT INTO #Results
				EXEC
				(
					'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
					FROM ' + @TableName + ' (NOLOCK) ' +
					' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
				)
			END
		END	
	END

	SELECT ColumnName, ColumnValue FROM #Results


Рейтинг:
0

Suvendu Shekhar Giri

Вы можете попробовать что-то вроде-

DELETE a, b
FROM messages a 
LEFT JOIN usersmessages b 
WHERE b.messageid = a.messageid and a.messageid = 1


Надеюсь, это поможет :)


Torakami

будет ли это работать для таблиц более 2

Suvendu Shekhar Giri

Она должна

Torakami

Я уже пробовал это

Удалить в,с
Из продукта а
Левое соединение CallLine б
на б.Кодтовара = а.Кодтовара
левое соединение CallOrder с
на C.Кодтовара = а.Кодтовара
где a. ProductID = 146

в первой строке написано недопустимый объект b