MyISAM धारावाहिक बनाने का बहुत सुविधाजनक तरीका देता है। उदा. तालिका में प्राथमिक कुंजी id+seq(-uence) है

id seq
1  1  insert into table(seq) values(1),(2),(3),(1),(2),(1),(1),(2);
1  2
1  3
2  1
2  2
3  1
4  1
4  2

तो तर्क यह है कि जब आईडी वही रहती है जब तक कि डुप्लिकेट कुंजी दिखाई न दे, इस मामले में (MyISAM) आईडी में वृद्धि करेगा।

लेकिन जब मैं इसे InnoDB में उपयोग करने का प्रयास करता हूं - काम नहीं करता है। क्या कोई समाधान है (क्योंकि मुझे लेनदेन की आवश्यकता है)?

धन्यवाद।

23 अक्टूबर 2003 8:41 बजे [नाम रोक दिया गया] द्वारा पोस्ट किए गए MySQL के मैनुअल की टिप्पणियों से बेहतर उदाहरण हो सकता है

create table location
(
    id bigint not null auto_increment, -- "serial" per 4.1
    longitude int,
    latitude int,
    place int,
    primary key(id, longitude, latitude, place)
);

insert into location (longitude, latitude, place)
values (0,0,0), (1,1,1), (2,2,2);

select * from foo;

+----+-----------+----------+-------+
| id | longitude | latitude | place |
+----+-----------+----------+-------+
|  1 |         0 |        0 |     0 |
|  2 |         1 |        1 |     1 |
|  3 |         2 |        2 |     2 |
+----+-----------+----------+-------+


drop table location;

create table location
(
    id bigint not null auto_increment, -- "serial" per 4.1
    longitude int,
    latitude int,
    place int,
    primary key(longitude, latitude, place, id)
);

insert into location (longitude, latitude, place)
values (0,0,0), (1,1,1), (2,2,2), (0,0,0);

select * from location order by id;

+----+-----------+----------+-------+
| id | longitude | latitude | place |
+----+-----------+----------+-------+
|  1 |         0 |        0 |     0 |
|  1 |         1 |        1 |     1 |
|  1 |         2 |        2 |     2 |
|  2 |         0 |        0 |     0 |
+----+-----------+----------+-------+
1
Lorenzo Manucci 17 जून 2011, 17:35
मुझे लगता है कि प्राथमिक कुंजी मिश्रित होने पर आप माईसाम की सुविधा के बारे में बात कर रहे हैं। यदि ऐसा है, नहीं - ऐसी सुविधा InnoDB के लिए उपलब्ध नहीं है। समाधान - auto_increment को हटा दें, कुंजी की गणना के लिए अपनी खुद की प्रक्रिया लिखें - मूल रूप से, एक बड़ी परेशानी।
 – 
Michael J.V.
17 जून 2011, 17:39

2 जवाब

सबसे बढ़िया उत्तर

लेकिन जब मैं इसे InnoDB में उपयोग करने का प्रयास करता हूं - काम नहीं करता है। क्या कोई समाधान है (क्योंकि मुझे लेनदेन की आवश्यकता है)?

आप इसके समाधान के लिए सलाहकार लॉक्स और ट्रिगर।

यह देखें PostgreSQL के लिए समान प्रश्न . आप इसका MySQL संस्करण लिखना चाहेंगे।

3
Community 23 मई 2017, 13:08
धन्यवाद, लेकिन मुझे लेन-देन में करीब 20 टेबल (एक्सएमएल आसन्न मैपिंग) में डालने की ज़रूरत है - इसलिए मुझे लेनदेन प्रबंधन को जितना संभव हो सके उतना आसान करने की ज़रूरत है।
 – 
Lorenzo Manucci
17 जून 2011, 17:44
खैर, ऐसा करने का एक आसान तरीका यह होगा कि आप अपनी टेबल को आवश्यकतानुसार लॉक कर दें। लेकिन यह धीमा होगा।
 – 
Denis de Bernardy
17 जून 2011, 17:47

यह काम करेगा:

create table location
(
    id bigint not null auto_increment,
    longitude int,
    latitude int,
    place int,
    primary key(longitude, latitude, place, id)
) ENGINE =myisam;

लेकिन यह नहीं होगा:

create table location
(
    id bigint not null auto_increment,
    longitude int,
    latitude int,
    place int,
    primary key(longitude, latitude, place, id)
) ENGINE =innodb;

चूंकि:

माईसाम के नुकसान

कोई डेटा अखंडता (जैसे संबंध की कमी) जांच नहीं करता है, जो तब डेटाबेस प्रशासकों और एप्लिकेशन डेवलपर्स की जिम्मेदारी और ओवरहेड आता है।

तथा

InnoDB के नुकसान

क्योंकि InnoDB को तालिकाओं के बीच विभिन्न संबंधों का ध्यान रखना होता है, डेटाबेस व्यवस्थापक और योजना निर्माताओं को डेटा मॉडल को डिजाइन करने में अधिक समय लेना पड़ता है जो MyISAM की तुलना में अधिक जटिल होते हैं।

1
Community 20 जून 2020, 12:12
मैंने पाया कि यह मेरे लिए innoDB में तब तक काम करेगा जब तक मैंने ऑटो-इंक्रिमेंटिंग फ़ील्ड को प्राथमिक कुंजी का पहला भाग बना दिया।
 – 
Gerry
18 अक्टूबर 2013, 08:09