SSMS допускает дублирование записей в таблице, но не последующие обновления

Изменить: Когда я говорю "SQL Server", я действительно говорю об Management Studio. Извините, если это сбивает с толку.

О, я ненавижу, когда такие вещи случаются. Вчера я работал с SQL Server и тестировал команду PIVOT, чтобы попытаться выяснить, как она работает. Поэтому я создал новую таблицу с четырьмя столбцами, и первый столбец будет иметь одно и то же значение для первых нескольких строк.

Я добавил значение "value1" в первую строку, первый столбец и нажал клавишу ввода. Никакие клавиши или ограничения не были добавлены, это позволило мне перейти к следующей строке с NULL для других столбцов в первой строке (что хорошо). К моему удивлению, это также позволило мне ввести "value1" во второй строке и войти вниз - это должно быть невозможно, так как теперь есть две одинаковые строки. Однако, поскольку я просто возился, это меня не беспокоило. Поэтому я перехожу к созданию четырех строк как таковых:

Таблица 1

Col1       Col2      Col3     Col4
---------------------------------
Value1     NULL      NULL     NULL
Value1     NULL      NULL     NULL
Value1     NULL      NULL     NULL
Value1     NULL      NULL     NULL

Очевидно, это странно и ломает реляционную теорию, но мне все равно, потому что это просто таблица, которую я создал, чтобы обходиться. Тем не менее, я просто вытащил волосы за то, что произошло дальше. После того, как у меня были эти данные, я не мог сделать ничего в таблице. Если бы я попытался заполнить col2, col3 или col4 в любой из строк, SQL Server будет кричать на меня за то, что у вас есть повторяющиеся строки: "Ни одна строка не была обновлена. Данные в строке 1 не были выполнены.... Значение строки обновлены или удалены либо не делают строку уникальной, либо изменяют несколько строк (4 строки)."

Таким образом, SQL Server разрешил мне вводить повторяющиеся строки, но когда я попытался обновить строки, чтобы сделать их уникальными, это не позволило бы мне, сославшись на то, что в качестве причины есть повторяющиеся строки. Хуже всего то, что я даже не мог удалить строки (я получаю то же сообщение об ошибке). Единственное решение, которое я нашел однажды в этом сценарии, - удалить таблицу и начать все, что смешно.

Мой вопрос: как такое поведение может существовать в хорошо известной программе, которая развилась за десятилетие? Могу ли я быть безмозглым, и я должен принять поведение SQL Server? Для меня это неприемлемо, и SQL Server должен либо никогда не разрешать мне вводить повторяющиеся строки в первую очередь, либо он должен был позволять мне обновлять повторяющиеся строки до тех пор, пока они не станут уникальными, а затем попытайтесь сохранить.

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

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

Итак, что здесь происходит? Нужно ли мне какое-то изменение парадигмы при приближении к SQL Server? Является ли это я или SQL Server проблемой? (Вы можете сказать это мне, я могу принять это.)

Ответ 1

Вся эта студия управления предоставляет пользовательский интерфейс для создания некоторого SQL для вас и запускает его для БД.

В вашем случае каждый раз, когда вы добавляли строку, она создавала оператор INSERT. Это совершенно верно.

Когда вы попытались использовать UI для УДАЛЕНИЯ или ОБНОВЛЕНИЯ одной записи из всех этих повторяющихся записей, она не смогла выполнить SQL для этого. Причина в том, что, поскольку в таблице не было ключа, нет способа создать предложение WHERE, которое будет представлять запись, которую вы пытались ОБНОВИТЬ или УДАЛИТЬ.

Это сообщение "error" звучит совершенно ясно и справедливо для меня.

Что касается ваших комментариев:

К моему удивлению, это также позволило мне введите "значение1" во второй строке и войти вниз - это должно быть невозможно так как теперь есть два одинаковых строк. Однако, поскольку я был просто это не беспокоило меня.

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

Нет ничего плохого в том, что таблица базы данных, которая допускает дубликаты, совершенно правильная вещь, если она вам нужна. Что касается не "заботы" или "беспокойства", что вы допустили дубликаты. Вот где ошибка. Именно тогда вы должны были осознать, что забыли добавить первичный ключ.

Ответ 2

Редактор записи в Sql Server Management Studio является небольшой (и относительно неважной) частью предложения продукта SQL Server. Я думаю, вы можете смело принять причуды редактора, не заботясь об относительном качестве самого сервера.

За кулисами Management Studio выполняет инструкции SQL для выполнения ваших действий, точно так же, как если бы вы набрали этот SQL самостоятельно. Поэтому, если вы нарушаете правило, вы платите штраф.

Ответ 3

Причуда да, но недостаток, нет. Это совершенно законно иметь таблицу без уникального ключа, но невозможно удалить из нее строку с редактором таблицы в SSMS (или Enterprise Manager до него), если есть одинаковые строки.

Не SSMS позволяет создавать повторяющиеся строки, это вы разрешили, когда создали таблицу без первичного ключа. Вы всегда можете создать автоинкрементный столбец идентичности, который бы разрешил проблему.

Я бы не использовал редактор таблиц для такого рода вещей, я бы script инструкции INSERT.

Ответ 4

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

Студия управления - это инструмент . Задача не в том, чтобы обеспечить идеальный дизайн таблицы или базовую базу данных 101, которая в большинстве случаев будет включать в себя какой-то уникальный ключ. Что делать, если у вас была какая-то сумасшедшая бизнес-модель, требующая дублирования строк? Не будет ли тогда жалоба, что инструмент предотвратил дублирование ролей?

Итог - это то, что 1. В любом случае вы не должны редактировать или удалять данные с помощью инструмента. Вы должны писать сценарии для большинства вещей.
2. У вас должен быть уникальный ключ

Нельзя винить какой-либо инструмент за то, что у вас нет таких вещей.