MSSql Int przyrostowy


(Marcin Obala) #1

Cześć mam takie pytanie. Jak zrobić pole w tabeli w bazie SQL o typie INT przyrostowe co 1 ?

Utwórz drugą tabelę CZLONKOWI o następującej strukturze: nr_osoby int przyrostowy od 100 co 1, nr_zespolu int, nazwisko znakowy do 60 znaków, imię znakowy do 40 znaków.

Polecenie jest dokładnie takie. Teraz pytanie. Czy da się to zrobić normalnie w sensie że int i jakoś auto_increment do tego? Bo u mnie to działa tylko wtedy kiedy nr_osoby jest kluczem jednak wtedy nie wiem jak zrobić żeby wartości zaczynały się od 100.

Ma ktoś jakąś radę?


(Tomek Matz) #2

Jest dokładnie tak jak mówisz, chodzi o autoinkrementację. Na kolumnie tej nie musi być założony klucz główny, żeby to działało. W ustawieniach autoinkrementacji ustaw seed na 100 i increment na 1.

CREATE TABLE CZLONKOWI(

	nr_osoby int IDENTITY(100,1) NOT NULL,

	nr_zespolu int NOT NULL,

	nazwisko nvarchar(60) NOT NULL,

	imię nvarchar(40) NOT NULL

)

BTW Nie powinno się używać polskich znaków w nazwach tabel/kolumn.


(Marcin Obala) #3

Właśnie o to chodziło. Dzięki bardzo :wink: co do polskich znaków to wiem, tam w treści po prostu z przyzwyczajenia wpisałem. A jeszcze jedno, odpowiednik polecenia Describe z MySQL? Albo show

show tables;

show databases;

describe czlonkowie;

Niestety w MsSql to nie działa.


(Tomek Matz) #4

Używanie konsoli do przeglądania tego typu informacji to raczej utrudnianie sobie życia. Zainstaluj MS SQL Server Management Studio Express. Jeśli jednak potrzebujesz pozyskiwać te informacje właśnie w ten sposób to możliwości jest sporo. Nie ma jednak tak ładnych poleceń jak w MySQL. No chyba, że za ładne uznamy np.:

exec sp_databases;

exec sp_tables;

Odsyłam do tego linku http://msdn.microsoft.com/en-us/library/ms177862.aspx Przejrzyj go sobie. Zdobędziesz informacje o tym jakie dane możesz wyciągnąć za pomocą zapytań do odpowiednich widoków (w zasadzie możesz wyciągnąć wszystko).

Poniżej przykładowe odpowiedniki (w odpowiedniej kolejności):

select name from sys.sysdatabases;

use ;

select name from sys.tables;

select * from information_schema.columns where table_name = 'czlonkowie'; (nie pamiętam co dokładnie robi mysql-owe describe, ale zakładam, że zwracało informacje o strukturze danej tabeli)


([alex]) #5

matzu , wystarczy:

explain czlonkowie;

  • to jest zapytanie zwracające kolumny: Field,Type,Null,Key,Default,Extra

lub:

show create table czlonkowie;

  • zwraca dwie kolumny, nazwa tabeli (nie wiem po kiego) i polecenie jakim należy utworzyć tabelę aby było to samo co jest teraz, nawet jeżeli tabela była niejednokrotnie modyfikowana przez np alter table).

(Tomek Matz) #6

@[alex]

Czy coś trzeba doinstalować (lub też zmienić w konfiguracji serwera), żeby użyć tych poleceń, o których wspominasz? Właśnie próbowałem to odpalić na MS SQL Server 2008 R2 Express with Advanced Services i nie dało rady.


([alex]) #7

matzu , to był dopisek do twojej uwagi do poleceń w MySQL. W MS SQL nawet nie myśl że coś takiego kiedykolwiek zrobią.


(Tomek Matz) #8

@[alex]

Rozumiem. Pewno masz rację co do tego, że takie polecenia się nie pojawią, ale przy użyciu wspomnianego wyżej MS SQL Server Management Studio Express można sobie w wygodny sposób tego typu informacje odczytywać. Przykładowo można tak .. ppm na nazwie tabeli -> Script Table As -> Create To -> New query editor window i gotowe. Tego typu opcje odnoszą się także do poleceń Insert, Update, Delete.


(Marcin Obala) #9

Ja oczywiście używam Managament Studio dla MS SQL i MySQL Workbench ale nie jestem typek klikacza tylko jedno proste zapytanie i widzę jak wygląda od środka a tam trzeba klikać i klikać i klikać. Tak w ogóle to z ciekawości zapytałem.


(Tomek Matz) #10

@Marcin511

Każdy ma inne upodobania :). Co Ci mogę polecić to możesz sobie przygotować własne systemowe procedury składowane, które będą zwracać dokładnie takie informacje jakie Cię interesują (bo te perspektywy, o których wyżej wspominałem zwracają nadmiar informacji). Później będziesz je sobie wywoływał exec sp_ i już. Uzyskasz w ten sposób funkcjonalność zbliżoną do tych poleceń MySQL, których normalnie używasz. Niestety wymaga to trochę własnej pracy. Plus jest taki, że nauczysz się przy tym składni T-SQL (przynajmniej w jakimś stopniu).


([alex]) #11

matzu , skoro wymieniasz plusy to należało by wymienić minusy, przede wszystkim zwiększone obciążenie serwera.


(Tomek Matz) #12

@[alex]

Mógłbyś dokładniej napisać co masz na myśli (i odnośnie czego piszesz)? Jeśli odnośnie tych systemowych procedur składowanych to ja jestem świadom tego, że one zwiększą obciążenie serwera, ale przecież nikt tego nie będzie używał na serwerze produkcyjnym (jeśli nie będzie takiej potrzeby). Założyłem, że autor tematu jest developerem i po prostu szuka sposobu na przyspieszenie sobie pracy z MS SQL Server.


(Marcin Obala) #13

A jeszcze jedno, jak zaktualizować pole w tabeli tak żeby przyjmowało tylko liczby od np. 1942? Przy Tworzeniu nowej kolumny to nie problem, jednak żeby zaktualizować...


(Tomek Matz) #14

A czy w tej tabeli masz już w tej kolumnie wartości, które są mniejsze niż 1942?


(Marcin Obala) #15

Szczerze to nie miałem. Znalazłem rozwiązanie na zasadzie ADD CONSTRAINT i zadziałało. Nie mogę wprowadzić nowych rekordów gdzie będzie mniej niż 1920 ale jak by się to polecenie zachowało jakby coś tam już takiego było to nie wiem.


(Tomek Matz) #16

Możesz sprawdzić przecież jakby się zachowało :slight_smile: Jeśli nie zmieniałeś nic w ustawieniach bazy danych to najprawdopodobniej wyrzucony zostanie wyjątek i zmiany nie zostaną zapisane (wprowadzenie takiego ograniczenia wymaga ponownego utworzenia tabeli). Jeśli jednak wprowadzałeś zmiany w bazie danych to tabela zostanie utworzona od nowa, a tym samym wszystkie dane zostaną utracone. Istnieje jeszcze klauzula nocheck, która pozwala na utworzenie ograniczenia mimo tego, że w tabeli istnieją już dane, które naruszają ten warunek. To podejście jednak nie jest zalecane.

Jeśli chciałbyś utworzyć constraint przy użyciu MS SQL Server Management Studio, to robisz tak:

Rozwijasz drzewko danej tabeli -> wybierasz gałąź Constraints -> ppm -> New Constraint... i już.

Jeśli chciałbyś zobaczyć jaki kod SQL został użyty do utworzenia tego ograniczenia to robisz tak:

Rozwijasz drzewko danej tabeli -> wybierasz i rozwijasz gałąź Constraints -> wybierasz konkretne ograniczenie -> ppm -> Script Constraint As -> Create To -> New query editor window


(Marcin Obala) #17

Ok ok wszystko ładnie :wink: ale w sprawku na studia nie mogę tak napisać :wink: muszę mieć czysty kod w MSSql :wink:


(Tomek Matz) #18

Ta druga opcja, o której wspomniałem w poprzednim poście, pozwoli Ci podejrzeć kod T-SQL (bo tak się to nazywa).