Рейтинг:
2
Peter Leow
Почему вы разрешаете дублировать записи в таблице базы данных? Цель первичного ключа состоит в том, чтобы предотвратить такое событие, и это правильно, что он препятствует тому, чтобы пользовательская форма вставляла одного и того же человека по имени прем Сингх более одного раза. Кто-то попытался быть умным, обойдя этот контроль первичного ключа, вставив этого же человека, но с отсутствующим нулем для его PersonID. Это приводит к неправильным данным и ставит под угрозу целостность вашей базы данных. Короче говоря, ответ на вашу ситуацию состоит в том, чтобы удалить этого према Сингха с неправильным PersonID и сделать то же самое с другими подобными записями из этого тупого взлома.
Вы или кто бы там ни был хакер должны прочитать об этом Введение в проектирование баз данных[^].
Вам лучше молиться, чтобы в других таблицах не было других записей, которые ссылаются на тех пользователей с hacked-PersonID в этой таблице, иначе вы столкнетесь с ограничением внешнего ключа при попытке удалить hacked-PersonID в этой таблице.
DINESH K MAURYA
Да, Питер, ты прав, большое спасибо
Я следую по ссылке, которую вы предоставляете, поэтому, пожалуйста, дайте мне знать, как найти этот тип записи(Pram singh).
Maciej Los
Питер,
Если я правильно понимаю ОП, дубликатов данных нет. Существует проблема в запросе обновления, который пытается обновить даже правильные данные в поле PersonUID. Пожалуйста, посмотрите мой ответ.
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 за ваши усилия.