Здравейте!
Има таблица zz с две колони:
ID - auto increment и
txt: Text.
Вкарвам нов запис:
Insert into zz (txt) values ('gfgdffgd');
Как да получа присвоената стойност на ID?
Здравейте!
Има таблица zz с две колони:
ID - auto increment и
txt: Text.
Вкарвам нов запис:
Insert into zz (txt) values ('gfgdffgd');
Как да получа присвоената стойност на ID?
Щом е нов, този запис ще получи поредния неизползван ID-номер.
Пробвай дали това:
select LAST_INSERT_ID() FROM zz;
ще ти даде търсената стойност.
Но това върви само ако Инсърта е приключил успешно.
Може би преди това трябва да се чекне дали е успял.
//
Тук съм сбъркала.
Тази функция връща последното ИД в базата, а не в конкретна нейна таблица.
Да хубаво е да се провери или да се пусне със стандартното :
select id from zz where txt='gfgdffgd';
Благодаря, това е което ми трябваше.Първоначално публикувано от Bibi
Имам още един въпрос, как да се реализира същата функционалност за OLEDB JET 4 бази данни, или т.нар. mdb формат на АДО??
Става въпрос за базите с данни, които създава MS Access.
Там има ограничение, което не позволява да се изпълняват повече от една заявки, разделени с ;
За това въпросът е може ли да се вкара записа и да се извлече номера му в една SQL конструкция.
А иначе вариантът с MySql е много удобен.
Колега, това 100 на 100 ще работи, ако има гаранция, че txt ще има уникални стойности.Първоначално публикувано от klamer
В моя случай уникалните стойности са само в полето ID.
Погледни тук:
http://www.w3schools.com/ado/default.asp
чете се лесно, има примери, чиито конструкции директно ще ти свършат работа, има и други полезни неща.
Освен това, ако пишеш на PHP/ASP или нещо от този род, може би има начин да ползваш техните функции?
Този вариант не е толкова добър колкото LAST_INSERT_ID(), но за сметка на това ще работи почти със всички сървъри, и ако има дублирани стойности на txt полето ще бъдат върнати всички id които отговарат на условието, проблемът в случая е друг : само с този select не може да се гарантира че най-голямата стойност на id е получена в моментаПървоначално публикувано от fuoco
, а не е от преди един месец например.
Ами аз всъщност не знам бази, така че е напълно нормално да не съм дала идеален отговор.
Това не знам какво означава.Първоначално публикувано от klamer
Ако някой обясни, ще съм благодарна - и аз искам да науча тези неща.
Ако го казвате в смисъл, че въпросната функция не винаги я има, не може ли вместо нея да се ползва по-стандартната MAX(ID), тя поне е по ANSI.
Да се направи един такъв MAX преди въвеждането на новия запис и още един след него и после двете стойности да се сравнят?
Ако се окаже, че са различни, това би трябвало да е хем гаранция за успешното добавяне, хем отговор на въпроса колко е новото ID. Ако са равни - лошо!
Друг вариант: ако се ползва примерно php, там има функция mysql_affected_rows, връщаща броя засегнати редове след последния INSERT. (Всъщност това може и без php - да си направим сами такава функция, от броя непразни клетки в колоната преди и след инсърта.)
Ако е 1, ще питаме за онова LAST_INSERT_ID(), а ако е 0, ще знаем, че има нещо гнило.
ДаПървоначално публикувано от Bibi
това също не е лоша идея
За да сте сигурни, че последния запис има най-голямо ID:
select @max_id:=max(`id`)+1 from `table1`;
insert into `table1` (`id`, `txt`) values (@max_id, 'abc')
mysql> select max(id) from test;
+---------+
| max(id) |
+---------+
| 9 |
+---------+
1 row in set (0.00 sec)
Напълно достатъчно според мен.
Това след като мине инсърта.
Зависи - може и да не е достатъчно.Първоначално публикувано от fori
Пример:
1)
truncate table table1;
insert into table1 values (1000,'text1');
insert into table1 values (1,'text2');
select * from table1
1;text2
1000;text1
2)
truncate table1;
insert into table1 (txt) values ('text1'),('text2'),('text3'),('text4'),('text5');
delete from table1 where id in (1,2,3);
insert into table1 (txt) values ('text-a');
insert into table1 values (1,'text-b');
select * from table1
1;text-b
4;text4
5;text5
6;text-a
И в двата случая последният запис не е този, с най-голямо id.
Да не споменавам, че в темата изобщо никой не разглежда възможността за конкурентни действия и контрола в/у изпълнението им.
Мда. Само че не винаги последния запис в auto increment полето е с 1-ца по-голям от предпоследния. Идеологията на auto increment полетата е самата база данни да определя стойността им автоматично. Т.е. да служат като уникален ключ в таблицата. Точно за това по идея при писане на приложение в базата се прави поле което е auto increment и се оставя самата база данни да запълва стойностите му.
Няма спор - двата примера демонстрират точно това: последния запис има стойност различна от стойността на предпосления + 1.
Използването на метода с изрично описване на id ти решава проблема с конкурентните действия - ако някой направи INSERT след твоя INSERT и преди твоя "SELECT max(id)", ще получиш id на чуждия insert, вместо на този, който ти си направил.
Ако го направиш с променливи, както съм показал в първия си пост по темата, ще знаеш id на записа, които ТИ си направил - той е запазен в променливата @mid от примера.
Така имаш контрол - ако insert ти пропадне, някой те е изпреварил и сървъра ще ти върне грешка за duplicate value in key id. Тогава просто повтаряш действието, докато се получи. Ако го направиш без променливи, базата данни няма да ти върне грешка и ще се чудиш какво става, когато заради max(id) промениш грешния запис в по-късен етап.
Някой има ли представа какво се случва с една таблица, когато тя се "препълни"?
Имам предвид когато за новата стойност на ID вече обхвата на тази променлива не стига.
Дали ще се получи ID с "най-голямата" отрицателна стойност, или някъде ще се появи грешка?
А когато се изчерпат и отрицателните?
И още един въпрос: ако в таблицата е имало запис, който е бил последен и след това е бил изтрит. Тогава методът на Ghost няма ли да използва освободеното от него ID, докато при fori ще се ползва по-голяма стойност? Поне аз така си го представям.
Последно: синтактически допустимо ли е да се сложи всичко в един израз, а именно:
INSETR INTO 'table1' ('id','txt') VALUES ({SELECT max('id') FROM 'table1'} + 1, 'abc');
или нещо подобно?