Страница 1 от 2 12 ПоследноПоследно
Резултати от 1 до 15 от общо 23

MySql :: Стойност на autoIncrement поле

Сподели във Facebook Сподели в Twitter Изпрати на Email Сподели в LinkedIn
  1. Junior Member
    Тук е от
    Oct 2004
    Мнения
    24
    #1

    MySql :: Стойност на autoIncrement поле

    Здравейте!
    Има таблица zz с две колони:
    ID - auto increment и
    txt: Text.

    Вкарвам нов запис:

    Insert into zz (txt) values ('gfgdffgd');

    Как да получа присвоената стойност на ID?

  2.  
     
  3. Senior Member Аватара на Bibi
    Тук е от
    Nov 2004
    Мнения
    2,757
    #2

    Re: MySql :: Стойност на autoIncrement поле

    Щом е нов, този запис ще получи поредния неизползван ID-номер.

    Пробвай дали това:
    select LAST_INSERT_ID() FROM zz;
    ще ти даде търсената стойност.

    Но това върви само ако Инсърта е приключил успешно.
    Може би преди това трябва да се чекне дали е успял.

    //
    Тук съм сбъркала.
    Тази функция връща последното ИД в базата, а не в конкретна нейна таблица.

  4. Member
    Тук е от
    Jun 2002
    Мнения
    796
    #3

    Re: MySql :: Стойност на autoIncrement поле

    Да хубаво е да се провери или да се пусне със стандартното :
    select id from zz where txt='gfgdffgd';

  5. Junior Member
    Тук е от
    Oct 2004
    Мнения
    24
    #4

    Re: MySql :: Стойност на autoIncrement поле

    Цитат Първоначално публикувано от Bibi
    Щом е нов, този запис ще получи поредния неизползван ID-номер.

    Пробвай дали това:
    select LAST_INSERT_ID() FROM zz;
    ще ти даде търсената стойност.

    Но това върви само ако Инсърта е приключил успешно.
    Може би преди това трябва да се чекне дали е успял.
    Благодаря, това е което ми трябваше.
    Имам още един въпрос, как да се реализира същата функционалност за OLEDB JET 4 бази данни, или т.нар. mdb формат на АДО??
    Става въпрос за базите с данни, които създава MS Access.
    Там има ограничение, което не позволява да се изпълняват повече от една заявки, разделени с ;

    За това въпросът е може ли да се вкара записа и да се извлече номера му в една SQL конструкция.

    А иначе вариантът с MySql е много удобен.

  6. Junior Member
    Тук е от
    Oct 2004
    Мнения
    24
    #5

    Re: MySql :: Стойност на autoIncrement поле

    Цитат Първоначално публикувано от klamer
    Да хубаво е да се провери или да се пусне със стандартното :
    select id from zz where txt='gfgdffgd';
    Колега, това 100 на 100 ще работи, ако има гаранция, че txt ще има уникални стойности.
    В моя случай уникалните стойности са само в полето ID.

  7. Senior Member Аватара на Bibi
    Тук е от
    Nov 2004
    Мнения
    2,757
    #6

    Re: MySql :: Стойност на autoIncrement поле

    Погледни тук:
    http://www.w3schools.com/ado/default.asp
    чете се лесно, има примери, чиито конструкции директно ще ти свършат работа, има и други полезни неща.

    Освен това, ако пишеш на PHP/ASP или нещо от този род, може би има начин да ползваш техните функции?

  8.  
     
  9. Member
    Тук е от
    Jun 2002
    Мнения
    796
    #7

    Re: MySql :: Стойност на autoIncrement поле

    Цитат Първоначално публикувано от fuoco
    Колега, това 100 на 100 ще работи, ако има гаранция, че txt ще има уникални стойности.
    В моя случай уникалните стойности са само в полето ID.
    Този вариант не е толкова добър колкото LAST_INSERT_ID(), но за сметка на това ще работи почти със всички сървъри, и ако има дублирани стойности на txt полето ще бъдат върнати всички id които отговарат на условието, проблемът в случая е друг : само с този select не може да се гарантира че най-голямата стойност на id е получена в момента , а не е от преди един месец например.

  10. Senior Member Аватара на Bibi
    Тук е от
    Nov 2004
    Мнения
    2,757
    #8

    Re: MySql :: Стойност на autoIncrement поле

    Ами аз всъщност не знам бази, така че е напълно нормално да не съм дала идеален отговор.
    Цитат Първоначално публикувано от klamer
    Този вариант ще работи с почти всички сървъри.
    Това не знам какво означава.
    Ако някой обясни, ще съм благодарна - и аз искам да науча тези неща.
    Ако го казвате в смисъл, че въпросната функция не винаги я има, не може ли вместо нея да се ползва по-стандартната MAX(ID), тя поне е по ANSI.
    Да се направи един такъв MAX преди въвеждането на новия запис и още един след него и после двете стойности да се сравнят?
    Ако се окаже, че са различни, това би трябвало да е хем гаранция за успешното добавяне, хем отговор на въпроса колко е новото ID. Ако са равни - лошо!

    Друг вариант: ако се ползва примерно php, там има функция mysql_affected_rows, връщаща броя засегнати редове след последния INSERT. (Всъщност това може и без php - да си направим сами такава функция, от броя непразни клетки в колоната преди и след инсърта.)
    Ако е 1, ще питаме за онова LAST_INSERT_ID(), а ако е 0, ще знаем, че има нещо гнило.

  11. Member
    Тук е от
    Jun 2002
    Мнения
    796
    #9

    Re: MySql :: Стойност на autoIncrement поле

    Цитат Първоначално публикувано от Bibi

    Ако го казвате в смисъл, че въпросната функция не винаги я има, не може ли вместо нея да се ползва по-стандартната MAX(ID), тя поне е по ANSI.
    Да се направи един такъв MAX преди въвеждането на новия запис и още един след него и после двете стойности да се сравнят?
    Да това също не е лоша идея

  12. Senior Member
    Тук е от
    Dec 2000
    Мнения
    3,218
    #10

    Re: MySql :: Стойност на autoIncrement поле

    За да сте сигурни, че последния запис има най-голямо ID:
    select @max_id:=max(`id`)+1 from `table1`;
    insert into `table1` (`id`, `txt`) values (@max_id, 'abc')

  13. Senior Member
    Тук е от
    Nov 2002
    Мнения
    1,594
    #11

    Re: MySql :: Стойност на autoIncrement поле

    mysql> select max(id) from test;
    +---------+
    | max(id) |
    +---------+
    | 9 |
    +---------+
    1 row in set (0.00 sec)

    Напълно достатъчно според мен.
    Това след като мине инсърта.

  14.  
     
  15. Senior Member
    Тук е от
    Dec 2000
    Мнения
    3,218
    #12

    Re: MySql :: Стойност на autoIncrement поле

    Цитат Първоначално публикувано от fori
    mysql> select max(id) from test;
    +---------+
    | max(id) |
    +---------+
    | 9 |
    +---------+
    1 row in set (0.00 sec)

    Напълно достатъчно според мен.
    Това след като мине инсърта.
    Зависи - може и да не е достатъчно.
    Пример:
    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.

    Да не споменавам, че в темата изобщо никой не разглежда възможността за конкурентни действия и контрола в/у изпълнението им.


  16. Senior Member
    Тук е от
    Nov 2002
    Мнения
    1,594
    #13

    Re: MySql :: Стойност на autoIncrement поле

    Мда. Само че не винаги последния запис в auto increment полето е с 1-ца по-голям от предпоследния. Идеологията на auto increment полетата е самата база данни да определя стойността им автоматично. Т.е. да служат като уникален ключ в таблицата. Точно за това по идея при писане на приложение в базата се прави поле което е auto increment и се оставя самата база данни да запълва стойностите му.

  17. Senior Member
    Тук е от
    Dec 2000
    Мнения
    3,218
    #14

    Re: MySql :: Стойност на autoIncrement поле

    Няма спор - двата примера демонстрират точно това: последния запис има стойност различна от стойността на предпосления + 1.
    Използването на метода с изрично описване на id ти решава проблема с конкурентните действия - ако някой направи INSERT след твоя INSERT и преди твоя "SELECT max(id)", ще получиш id на чуждия insert, вместо на този, който ти си направил.
    Ако го направиш с променливи, както съм показал в първия си пост по темата, ще знаеш id на записа, които ТИ си направил - той е запазен в променливата @mid от примера.
    Така имаш контрол - ако insert ти пропадне, някой те е изпреварил и сървъра ще ти върне грешка за duplicate value in key id. Тогава просто повтаряш действието, докато се получи. Ако го направиш без променливи, базата данни няма да ти върне грешка и ще се чудиш какво става, когато заради max(id) промениш грешния запис в по-късен етап.


  18. Senior Member Аватара на Bibi
    Тук е от
    Nov 2004
    Мнения
    2,757
    #15

    Re: MySql :: Стойност на autoIncrement поле

    Някой има ли представа какво се случва с една таблица, когато тя се "препълни"?
    Имам предвид когато за новата стойност на ID вече обхвата на тази променлива не стига.
    Дали ще се получи ID с "най-голямата" отрицателна стойност, или някъде ще се появи грешка?
    А когато се изчерпат и отрицателните?

    И още един въпрос: ако в таблицата е имало запис, който е бил последен и след това е бил изтрит. Тогава методът на Ghost няма ли да използва освободеното от него ID, докато при fori ще се ползва по-голяма стойност? Поне аз така си го представям.

    Последно: синтактически допустимо ли е да се сложи всичко в един израз, а именно:
    INSETR INTO 'table1' ('id','txt') VALUES ({SELECT max('id') FROM 'table1'} + 1, 'abc');
    или нещо подобно?

Сподели във Facebook Сподели в Google Plus Сподели в Twitter Изпрати на Email Сподели в LinkedIn
Страница 1 от 2 12 ПоследноПоследно

Подобни теми

  1. Вредното електромагнитно поле....
    От hristoslav2 във форум Смартфони, телефони
    Отговори: 0
    Последно: 28-07-11, 19:54
  2. Отговори: 2
    Последно: 31-08-08, 00:01
  3. Картинка в адресното поле
    От Sitron във форум Уебдизайн и 3D
    Отговори: 15
    Последно: 30-09-06, 13:34
  4. HTML help popup при маркиране на поле
    От spritable във форум Програмиране
    Отговори: 6
    Последно: 04-07-06, 09:49
  5. Анкета Минно Поле
    От DoHKuXoT във форум Анкети
    Отговори: 20
    Последно: 31-05-04, 13:41

SetCombG.com
SetCombG.com е портален сайт и Форум за битова техника, телевизори, климатици, лаптопи и смартфони, създаден през 1999 година.
Заедно сме над 20 години!
Следвай ни
Горе