#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть таблица SQL Server с полями: id, city, country
. Я импортировал эту таблицу из файла Excel, все импортировано успешно, но id
поле не упорядочено по номеру. Инструмент, который я использую, импортировал строки в некотором случайном числе.
Какую команду обновления я должен использовать из SQL Server Management Studio Express, чтобы изменить порядок моих идентификаторов?
Комментарии:
1. В любой реляционной базе данных вы не «переупорядочиваете» свои идентификаторы — вы получаете какой-либо порядок, только если вы специально используете
SELECT (columns) FROM dbo.YourTable ORDER BY ID
в своих запросах — это единственный способ «упорядочить» что-либо
Ответ №1:
Есть ли у вас первичный ключ и кластеризованный индекс в вашей таблице? Если нет, id
является хорошим кандидатом на первичный ключ, и когда вы создадите этот первичный ключ, он будет кластеризованным индексом.
Предполагая, что это ваша таблица
create table CityCountry(id int, city varchar(10), country varchar(10))
И вы добавляете данные следующим образом.
insert into CityCountry values (2, '2', '')
insert into CityCountry values (1, '1', '')
insert into CityCountry values (4, '4', '')
insert into CityCountry values (3, '3', '')
Вывод select * from CityCountry
будет
id city country
----------- ---------- ----------
2 2
1 1
4 4
3 3
Столбец, являющийся первичным ключом, не может принимать значения null, поэтому сначала вам нужно выполнить
alter table CityCountry alter column id int not null
Затем вы можете добавить первичный ключ
alter table CityCountry add primary key (id)
Когда вы это делаете select * from CityCountry
, теперь вы получаете
id city country
----------- ---------- ----------
1 1
2 2
3 3
4 4
Комментарии:
1. У меня есть моя цель, я знаю, почему я хочу этот порядок, поэтому любые советы, почему вы этого хотите, в этом нет особого смысла, на данный момент бесполезны для меня. Моя таблица не имеет связи с другой таблицей, поэтому каскадирование не произойдет. В столбце my id нет нулевых значений. Мои идентификаторы упорядочены по умолчанию 87, 3, 15, 123, 56, 4 — итак, я не хочу переименовывать или повторно сопоставлять их, я не хочу, чтобы записи располагались в том порядке, в котором они находятся сейчас. Я хочу, чтобы они были в порядке до импорта (упорядочены по идентификатору). Итак, ответы Хосе Руи Сантоса, Микаэля Эрикссона не являются решением в моем случае.
2. @user569008, было бы действительно полезно, если бы вы могли добавить некоторые примеры данных к вашему вопросу, как до, так и после обновления. То, что я предложил, и то, что предложил Хосе Руи Сантос, даст вам разные результаты. Если вы сделаете то, что я говорю, порядок строк будет изменен. Решение от Jose изменяет идентификатор для строк. Я не понимаю, как может быть третий способ сделать это.
3. Запрос Томаса, я не уверен, что понимаю, что именно он делает. Когда я пытаюсь использовать запрос Томаса, он выдает «Недопустимое имя столбца ‘NewId'».
4. Пример: Мои записи на данный момент: запись 1: идентификатор: 34, страна: Германия, город: Берлин; запись 2: идентификатор: 2, страна: США, город: Нью-Йорк; запись 3: идентификатор: 325, страна: Англия, город: Лондон. Допустим, у меня есть 10 000 записей. Я хочу, чтобы мои записи были физически переупорядочены по идентификатору (не переименованы или не используются только с помощью select). Когда я открываю таблицу, я хочу видеть их упорядоченными по идентификатору.
5. Я полностью согласен с тем, что сказал Микаэль Эрикссон. Если вы хотите, чтобы строки были упорядочены по идентификатору, просто добавьте PK и кластеризованный индекс, как показано в решении Майкла. Если вы хотите изменить порядок и переименовать идентификаторы, просто используйте мой. Вы хотя бы пробовали их? Я также не вижу третьего способа сделать это.
Ответ №2:
Просто используйте order by в инструкции select, чтобы упорядочить их.
Комментарии:
1. Я знаю о командах Select и Order By. Я не хочу выбирать, я хочу обновить, выполнить действие. Возможно ли сказать мне, существует ли такая команда?
Ответ №3:
Если я вас правильно понял, вы хотите, чтобы все идентификаторы имели последовательные номера 1,2,3,4…
Изображение содержимого вашей таблицы является:
select *
from yourTable
id city country
----------- ---------- ----------
1 Madrid Spain
3 Lisbon Portugal
7 Moscow Russia
10 Brasilia Brazil
(4 row(s) affected)
Чтобы изменить порядок идентификаторов, просто запустите это:
declare @counter int = 0
update yourTable
set @counter = id = @counter 1
(4 row(s) affected)
Теперь вы можете проверить, действительно ли все идентификаторы переупорядочены:
select *
from yourTable
id city country
----------- ---------- ----------
1 Madrid Spain
2 Lisbon Portugal
3 Moscow Russia
4 Brasilia Brazil
(4 row(s) affected)
Однако с этим нужно быть осторожным. Если какая-либо таблица имеет внешний ключ к этому id
столбцу, то сначала вам нужно отключить этот FK, обновить эту таблицу, обновить значения в других таблицах, в которых FK указывают на yourTable, наконец, снова включить FKS
Ответ №4:
Во-первых, я думаю, у вас могут быть некоторые неправильные представления о назначении столбца Id. Столбец Id, вероятно, является суррогатным ключом; то есть произвольным значением, уникальным и ненулевым, которое никогда не показывается пользователю. Таким образом, не следует подразумевать, что она имеет какое-либо значение наследования или последовательность. Фактически, у вас всегда должен быть другой столбец или столбцы, помеченные как уникальные для представления «бизнес-ключа» или набора значений, уникальных для пользователя. В вашем случае, city, country
вероятно, должно быть уникальным (хотя вам, вероятно, потребуется добавить провинцию или штат, поскольку обычно один и тот же город существует в одной и той же стране несколько раз.)
Теперь, с учетом сказанного, можно изменить последовательность ваших идентификаторов, если верно следующее:
- Столбец Id не является столбцом identity. Поскольку это было из импорта, я собираюсь предположить, что это правда.
- Не существует связи с таблицей, в которой не включено каскадное обновление.
- Вы используете SQL Express 2005 или более поздней версии:
Update MyTable
Set Id = T2.NewId
From (
Select Id
, Row_Number() Over ( Order By Id ) As NewId
From MyTable
) As T1
Join MyTable As T2
On T2.Id = T1.Id