kaniagostyn *UKS Kania Gostyń
Dlast. Juzer Grzegorz Danowski <gdn__na@serwerze__poczta.onet.plnapisał
|| DFirts, DLast wbrew pozorom zwracają ci przypadkowy rekord, chyba, że
|| stosujesz go do kweredy z sortowaniem. Stosowanie DFirst i DLast do
|| tabeli nie ma najmniejszego sensu.
| A nie jest tak, że DFirst, DLast zapuszczone na tabeli zwracają rekord
| wg kolejności klucza głównego? Coś mi tak chodzi po głowie, ale pewnie
| się mylę.
Generalnie wg kolejności klucza głównego, ale ... jedynie po
defragmentacji !
(pod warunkiem, ze mówimy o mdb, z Identity przyrostowym!)
Jeśli kluczem głównym jest autonumer (przyrostowy!) i nie ma kwerend typu
"insert into tabela1 (id ...) Values (1000, ...)", które by jawnie
wpisywały do autonumeru coś w innym niż naturalny porządek, to ok!
Ale są przypadki zarówno Insertów z jawnym nadawaniem autonumeru, jak
tabele z autonumerem losowym ! W każdym z tych przypadków klucz główny nie
będzie ustawiony w porządku dodawania!
Zupełnie już pominę kwestię kluczy naturalnych, których generalnie nie
używam !
Jeszcze inna sprawa to merge-replication w MS-SQL, gdzie MS-SQL bierze na
siebie kwestię zakresów "autonumeru" dostępnego dla każdego z juzerów.
W skrócie: juzer =1 dodaje rekordy w zakresie 1-2000, a juzer = 2 w
zakresie 2001-4000, a juzer = N w zakresie (2N-1)*1000 - 2N*1000.
Jak któryś dojdzie do 80% dostępnego zakresu, to agent replikacji
automatycznie przerzuci mu zakres na pierwszy nie zajęty ...
Znów wracając do accessa:
mam klucz naturalny: nr klienta / rok / miesiąc / kolejna faktura tego
klienta w miesiącu
czyli tekst typu 124/2006/6/12
po każdej defragmentacji porządek rekordów będzie zgodny z porządkiem
alfabetycznym tego klucza !
Summa summarum, nawet porządek Identity przyrostowego w wielu przypadkach
NIE WSKAZUJE na rekord rzeczywiście ostatnio wpisany !
To co mówi help jest prawdą: w ogólnym przypadku First i Last zwracają to
samo co DLookUp - coś zupełnie przypadkowego!
Użyteczność tych pierwszych jest wyraźna jedynie przy odpowiednim sorcie !
Ale zwykle dokładnie to samo można uzyskać przy pomocy Max lub Min -
wystarczy ruszyć głową i nigdy nie polegać na naturalnym porządku zapisu
rekordów w pliku!
LastModyfity ADO ???. Przyklad z BooksOnLine SQL7
Przepraszam, ze w angielskim (brak czasu)
---
Syntax
@@IDENTITY
Return Types
numeric
Remarks
After an INSERT, SELECT INTO, or bulk copy statement completes, @@IDENTITY
contains the last identity value generated by the statement. If the statement
did not affect any tables with identity columns, @@IDENTITY returns NULL. If
multiple rows are inserted, generating multiple identity values, @@IDENTITY
returns the last identity value generated. If the statement fires on or more
triggers that perform inserts that generate identity values, calling @@IDENTITY
immediately after the statement returns the last identity value generated by the
triggers. The @@IDENTITY value does not revert to a previous setting if the
INSERT or SELECT INTO statement or bulk copy fails, or if the transaction is
rolled back.
Examples
This example inserts a row into a table with an identity column and uses
@@IDENTITY to display the identity value used in the new row.
INSERT INTO jobs (job_desc,min_lvl,max_lvl) VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
===
SĂławomir Kupski <s@kot.com.plw wiadomoĂści 956nf5$89@h1.uw.edu.pl
oznajmiĂł/a:
dokĂładnie chodi mi o ID przyznawany przez sekwencjÄĹź
tymczasowo rozwiĂązalem to metodĂą MoveLast i robi to co chcÄĹź ale nie jestem
do tego przekonany
W DAO bylo LastModyfity i rozwiĂązywalo caĂły problem
Korzystam z MSSQL 2000
Sprawa z datĂą chyba odpada ale jeszcze siÄĹź nad tym zastanowiÄĹź
Slawek
| Czy nie jest lepiej do rekordu dopisaÄŚ jego datÄĹź modyfikacji ?
| ByÄŚ moĂże chodzi ci o ostatnio przyznany ID przez sekwencjÄĹź. Wtedy poczytaj
| dokumentacjÄĹź bazy danych, którĂą uĂżywasz. Tam bÄĹździe odpowiedĂź.
LastModyfity ADO ???. Chyba zapomniałem dodać iż wszystkie operacje wykonywane są na recordset-ach
Slawek
Przyklad z BooksOnLine SQL7
Przepraszam, ze w angielskim (brak czasu)
---
Syntax
@@IDENTITY
Return Types
numeric
Remarks
After an INSERT, SELECT INTO, or bulk copy statement completes, @@IDENTITY
contains the last identity value generated by the statement. If the
statement
did not affect any tables with identity columns, @@IDENTITY returns NULL.
If
multiple rows are inserted, generating multiple identity values,
@@IDENTITY
returns the last identity value generated. If the statement fires on or
more
triggers that perform inserts that generate identity values, calling
@@IDENTITY
immediately after the statement returns the last identity value generated
by the
triggers. The @@IDENTITY value does not revert to a previous setting if
the
INSERT or SELECT INTO statement or bulk copy fails, or if the transaction
is
rolled back.
Examples
This example inserts a row into a table with an identity column and uses
@@IDENTITY to display the identity value used in the new row.
INSERT INTO jobs (job_desc,min_lvl,max_lvl) VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
===
Sławomir Kupski <s@kot.com.plw wiadomości 956nf5$89@h1.uw.edu.pl
oznajmił/a:
| dokładnie chodi mi o ID przyznawany przez sekwencję
| tymczasowo rozwiązalem to metodą MoveLast i robi to co chcę ale nie
jestem
| do tego przekonany
| W DAO bylo LastModyfity i rozwiązywalo cały problem
| Korzystam z MSSQL 2000
| Sprawa z datą chyba odpada ale jeszcze się nad tym zastanowię
| Slawek
| | | Czy nie jest lepiej do rekordu dopisać jego datę modyfikacji ?
| Być może chodzi ci o ostatnio przyznany ID przez sekwencję. Wtedy
poczytaj
| dokumentację bazy danych, którą używasz. Tam będzie odpowiedź.
Zwrot pola zaraz po INSERT 'cie (teoria). mojeza <naj@hotmail.com napisał(a):
On Aug 28, 1:31 pm, Jacek <ad@moj.pl wrote:
To mi wyglada, jak zastanawianie sie nad jajkiem i kura:)
No nie koniecznie, wychodzac z Twojego zalozenia mozna sobie narobic
klopotow. W MS SQL istnieja 3 sposoby aby uzyskac identity column po
INSERT, napewno w MySQL sa takie same odpowiedniki:
<COPY BOL
SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions in
that they return values inserted into IDENTITY columns.
IDENT_CURRENT is not limited by scope and session; it is limited to a
specified table. IDENT_CURRENT returns the value generated for a
specific table in any session and any scope. For more information, see
IDENT_CURRENT.
SCOPE_IDENTITY and @@IDENTITY will return last identity values
generated in any table in the current session. However, SCOPE_IDENTITY
returns values inserted only within the current scope; @@IDENTITY is
not limited to a specific scope.
For example, you have two tables, T1 and T2, and an INSERT trigger
defined on T1. When a row is inserted to T1, the trigger fires and
inserts a row in T2. This scenario illustrates two scopes: the insert
on T1, and the insert on T2 as a result of the trigger.
Assuming that both T1 and T2 have IDENTITY columns, @@IDENTITY and
SCOPE_IDENTITY will return different values at the end of an INSERT
statement on T1.
@@IDENTITY will return the last IDENTITY column value inserted across
any scope in the current session, which is the value inserted in T2.
SCOPE_IDENTITY() will return the IDENTITY value inserted in T1, which
was the last INSERT that occurred in the same scope. The
SCOPE_IDENTITY() function will return the NULL value if the function
is invoked before any insert statements into an identity column occur
in the scope.
</COPY BOL
Tak wiec nalezy znalesc odpowiednik SCOPE_IDENTITY() w MySQL i nie
bedzie problemow.
Wykonanie ponizszego kodu generuje blas
insert into test (id,name) value ('','test');
SELECT @@IDENTITY;
#1064 - Something is wrong in your syntax obok '@IDENTITY' w linii 1
Samo uzycie
SELECT @IDENTITY; zwaraca NULL
Panowie inne pomysly?
Zwrot pola zaraz po INSERT 'cie (teoria). Ula pisze:
mojeza <naj@hotmail.com napisał(a):
On Aug 28, 1:31 pm, Jacek <ad@moj.pl wrote:
To mi wyglada, jak zastanawianie sie nad jajkiem i kura:)
No nie koniecznie, wychodzac z Twojego zalozenia mozna sobie narobic
klopotow. W MS SQL istnieja 3 sposoby aby uzyskac identity column po
INSERT, napewno w MySQL sa takie same odpowiedniki:
<COPY BOL
SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions in
that they return values inserted into IDENTITY columns.
IDENT_CURRENT is not limited by scope and session; it is limited to a
specified table. IDENT_CURRENT returns the value generated for a
specific table in any session and any scope. For more information, see
IDENT_CURRENT.
SCOPE_IDENTITY and @@IDENTITY will return last identity values
generated in any table in the current session. However, SCOPE_IDENTITY
returns values inserted only within the current scope; @@IDENTITY is
not limited to a specific scope.
For example, you have two tables, T1 and T2, and an INSERT trigger
defined on T1. When a row is inserted to T1, the trigger fires and
inserts a row in T2. This scenario illustrates two scopes: the insert
on T1, and the insert on T2 as a result of the trigger.
Assuming that both T1 and T2 have IDENTITY columns, @@IDENTITY and
SCOPE_IDENTITY will return different values at the end of an INSERT
statement on T1.
@@IDENTITY will return the last IDENTITY column value inserted across
any scope in the current session, which is the value inserted in T2.
SCOPE_IDENTITY() will return the IDENTITY value inserted in T1, which
was the last INSERT that occurred in the same scope. The
SCOPE_IDENTITY() function will return the NULL value if the function
is invoked before any insert statements into an identity column occur
in the scope.
</COPY BOL
Tak wiec nalezy znalesc odpowiednik SCOPE_IDENTITY() w MySQL i nie
bedzie problemow.
Wykonanie ponizszego kodu generuje blas
insert into test (id,name) value ('','test');
SELECT @@IDENTITY;
#1064 - Something is wrong in your syntax obok '@IDENTITY' w linii 1
Samo uzycie
SELECT @IDENTITY; zwaraca NULL
Panowie inne pomysly?
a dodajesz cos w insercie ?
bo twoj insert jest zly :
insert into test (id,name) value (NULL,'test');
badz taki
insert into test (name) value ('test');
przy zalazeniu ze id to autoincrement
a dzila na 100% bo wykorzystuje w aplikacji pisanej C# w php
wykorzystuje mysql_insert_id();
Zwrot pola zaraz po INSERT 'cie (teoria). keczerad <kecze@poczta.fm napisał(a):
Ula pisze:
mojeza <naj@hotmail.com napisał(a):
On Aug 28, 1:31 pm, Jacek <ad@moj.pl wrote:
To mi wyglada, jak zastanawianie sie nad jajkiem i kura:)
No nie koniecznie, wychodzac z Twojego zalozenia mozna sobie narobic
klopotow. W MS SQL istnieja 3 sposoby aby uzyskac identity column po
INSERT, napewno w MySQL sa takie same odpowiedniki:
<COPY BOL
SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions in
that they return values inserted into IDENTITY columns.
IDENT_CURRENT is not limited by scope and session; it is limited to a
specified table. IDENT_CURRENT returns the value generated for a
specific table in any session and any scope. For more information, see
IDENT_CURRENT.
SCOPE_IDENTITY and @@IDENTITY will return last identity values
generated in any table in the current session. However, SCOPE_IDENTITY
returns values inserted only within the current scope; @@IDENTITY is
not limited to a specific scope.
For example, you have two tables, T1 and T2, and an INSERT trigger
defined on T1. When a row is inserted to T1, the trigger fires and
inserts a row in T2. This scenario illustrates two scopes: the insert
on T1, and the insert on T2 as a result of the trigger.
Assuming that both T1 and T2 have IDENTITY columns, @@IDENTITY and
SCOPE_IDENTITY will return different values at the end of an INSERT
statement on T1.
@@IDENTITY will return the last IDENTITY column value inserted across
any scope in the current session, which is the value inserted in T2.
SCOPE_IDENTITY() will return the IDENTITY value inserted in T1, which
was the last INSERT that occurred in the same scope. The
SCOPE_IDENTITY() function will return the NULL value if the function
is invoked before any insert statements into an identity column occur
in the scope.
</COPY BOL
Tak wiec nalezy znalesc odpowiednik SCOPE_IDENTITY() w MySQL i nie
bedzie problemow.
Wykonanie ponizszego kodu generuje blas
insert into test (id,name) value ('','test');
SELECT @@IDENTITY;
#1064 - Something is wrong in your syntax obok '@IDENTITY' w linii 1
Samo uzycie
SELECT @IDENTITY; zwaraca NULL
Panowie inne pomysly?
a dodajesz cos w insercie ?
bo twoj insert jest zly :
insert into test (id,name) value (NULL,'test');
badz taki
insert into test (name) value ('test');
przy zalazeniu ze id to autoincrement
a dzila na 100% bo wykorzystuje w aplikacji pisanej C# w php
wykorzystuje mysql_insert_id();
Zgadzam sie ze mysql_insert_id(); zwroci nr wiersza ale jak zrobic to w
czystym SQL'u?
INSERT INTO test (id,name) VALUE (NULL,'test');
.... i tu co?
zanotowane.pldoc.pisz.plpdf.pisz.plshirli.pev.pl