DINESH K MAURYA Ответов: 2

Как обновить дублирующуюся запись


Привет,

У меня есть таблица личная информация где находится personUID
PRIMARY Key

PersId		PersonUID    	PersonnelName
137		01066141L	PREM SINGH  
128		02679425F	RADHAKRISHANAN
129		1066141L	PREM SINGH
130		04457802P	MOTI SINGH  
135		2365847P        Ramesh

В этой таблице я хочу, чтобы обновить этот столбец personuid что меньше, чем 9 цифр. Добавьте с нулем в начале, но кроме тех нет, которые уже добавлены с нулем, как прем Сингх .

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

Я попробовал простой запрос обновления, но исключение - это нарушение первичного ключа из-за Према Сингха

Maciej Los

Можете ли вы предоставить более подробную информацию о вашей схеме datatable?

2 Ответов

Рейтинг:
2

Peter Leow

Почему вы разрешаете дублировать записи в таблице базы данных? Цель первичного ключа состоит в том, чтобы предотвратить такое событие, и это правильно, что он препятствует тому, чтобы пользовательская форма вставляла одного и того же человека по имени прем Сингх более одного раза. Кто-то попытался быть умным, обойдя этот контроль первичного ключа, вставив этого же человека, но с отсутствующим нулем для его PersonID. Это приводит к неправильным данным и ставит под угрозу целостность вашей базы данных. Короче говоря, ответ на вашу ситуацию состоит в том, чтобы удалить этого према Сингха с неправильным PersonID и сделать то же самое с другими подобными записями из этого тупого взлома.
Вы или кто бы там ни был хакер должны прочитать об этом Введение в проектирование баз данных[^].
Вам лучше молиться, чтобы в других таблицах не было других записей, которые ссылаются на тех пользователей с hacked-PersonID в этой таблице, иначе вы столкнетесь с ограничением внешнего ключа при попытке удалить hacked-PersonID в этой таблице.


DINESH K MAURYA

Да, Питер, ты прав, большое спасибо
Я следую по ссылке, которую вы предоставляете, поэтому, пожалуйста, дайте мне знать, как найти этот тип записи(Pram singh).

Maciej Los

Питер,
Если я правильно понимаю ОП, дубликатов данных нет. Существует проблема в запросе обновления, который пытается обновить даже правильные данные в поле PersonUID. Пожалуйста, посмотрите мой ответ.

Peter Leow

Отмеченный.

Maciej Los

Я решил поднять ваш ответ (+5), потому что он содержит очень хорошие советы по дизайну базы данных.

Рейтинг:
0

Maciej Los

Взгляните на пример:

--create variable - type of table
DECLARE @tmp TABLE(PersId INT, PersonUID VARCHAR(9) PRIMARY KEY, PersonnelName VARCHAR(30))

--insert sample data into table
INSERT INTO @tmp (PersId, PersonUID, PersonnelName)
VALUES(137, '01066141L', 'PREM SINGH'), 
(128, '02679425F', 'RADHAKRISHANAN'),
(129, '1066141L', 'PREM SINGH'),
(130, '04457802P', 'MOTI SINGH'),
(135, '2365847P', 'Ramesh')

--update data
UPDATE t1 SET PersonUID = RIGHT('000000000', 9-LEN(t1.PersonUID)) + t1.PersonUID
FROM @tmp AS t1 INNER JOIN  
(
	SELECT PersId, PersonUID, ROW_NUMBER() OVER(PARTITION BY RIGHT('000000000', 9-LEN(PersonUID)) + PersonUID ORDER BY LEN(PersonUID) DESC) AS PID, PersonnelName 
	FROM @tmp 
) AS t2 ON t1.PersId = t2.PersId AND t2.PID = 1

--show data after apdate
SELECT *
FROM @tmp


Результат:
137	01066141L	PREM SINGH
128	02679425F	RADHAKRISHANAN
129	1066141L	PREM SINGH   --skipped
130	04457802P	MOTI SINGH
135	02365847P	Ramesh       --added leading zeros


Я надеюсь, что приведенный выше пример поможет вам понять, как обновить ваши данные.

[РЕДАКТИРОВАТЬ]

Я использовал НОМЕР СТРОКИ()[^] функция определения того, какая запись дублируется. ROW_NUMBER() функция возвращает порядковый номер строки в разделе результирующего набора, начиная с 1 для первой строки в каждом разделе.


DINESH K MAURYA

сэр,
Я хочу обновить пропустить те записи, которые уже равны нулю, а остальные записи, которые меньше 9, обновить с нулем. personuid-это первичный ключ.
заранее спасибо.

Maciej Los

И разве мой код не соответствует вашим критериям? Каков ожидаемый результат?

DINESH K MAURYA

PersId		PersonUID    	PersonnelName
137		01066141L	PREM SINGH  
128		02679425F	RADHAKRISHANAN
129		1066141L	PREM SINGH
130		04457802P	MOTI SINGH  
135		02365847P        Ramesh


только Рамеш-это обновление..
или который меньше 9 за исключением более скользкого с нулем
У меня есть запись 5K, в которой некоторые из similer с нулем, а некоторые меньше 9.

Maciej Los

Взгляните на мой набор результатов. Мой запрос изменяет PersonUID для Prem Singh (PersID=129) и добавляет ведущий ноль. Я прав?

DINESH K MAURYA

Сэр,
Если я обновлю 1066141L PREM SINGH, который уже с добавлением с нулем см. persid=137, если я обновлю persid =129, то erros msg пойдет первичным ключом насилия.
Поэтому, когда обновление затем проверить, что другой нет в этом столбце добавить с нулем или нет, если он есть, то пропустить другое мудрое обновление с нулем.

Maciej Los

Ладно, теперь я вижу. Ждите моего следующего ответа.

Maciej Los

Мне нужны подробности... Если" прем Сингх " дублируется (PersID= 129 и 137), то зачем пропускать обновление PersId=129? Я бы предложил удалить эту запись.

Maciej Los

Вы должны проверить свои данные. Кажется, вы должны использовать LTRIM() и RTRIM() методы в WHERE предложение запроса обновления, т. е.:
WHERE LEN(LTRIM(RTRIM(PersonUID))) <9

Peter Leow

5ed за ваши усилия.