MySQL में कहें मेरे पास एक कॉलम है जो आईडी है, बस int ऑटो वृद्धि।

क्या कोई तरीका है कि मैं PHP का उपयोग करके मुझे बता सकता हूं कि कोई आईडी कब हटा दी गई है?

जैसे कहो मेरे पास है

5 6 7 8 10

मुझे यह बताने की जरूरत है कि 9 गायब है, और इसे सभी आईडी के लिए जारी रखें। क्या इसे करने का कोई तरीका है?

धन्यवाद

0
Belgin Fish 8 अगस्त 2011, 18:12
1
AFAIK, नहीं, कोई रास्ता नहीं है (बस)। क्या मैं पूछ सकता हूं कि आप ऐसा क्यों करना चाहते हैं?
 – 
Bojangles
8 अगस्त 2011, 18:13

3 जवाब

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

आपको एक ऐसी तालिका की आवश्यकता है जिसमें सभी मान हों। फिर लापता आईडी खोजने के लिए बाएं जुड़ना आसान है।

create table all_values
(id int not null) engine = myisam;

insert into all_values (id) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

create table existing_values like all_values;

insert into existing_values (id) values (5),(6),(7),(8),(10);

select a.id from all_values as a
left join existing_values as b
on a.id = b.id
where b.id is null
2
Nicola Cossu 8 अगस्त 2011, 18:18
श्वेत। इस बारे में कभी नहीं सोचा। मुझे उम्मीद है कि ओपी रखरखाव के लिए सिर्फ एक बार (या कुछ बार) ऐसा कर रहा है, सार्वजनिक प्रक्रिया के हिस्से के रूप में नहीं।
 – 
Bojangles
8 अगस्त 2011, 18:23
धन्यवाद ठीक वही जो मुझे चाहिए था, और हाँ यह केवल एक बार बहुत सप्ताह की तरह चलने वाला है :)
 – 
Belgin Fish
8 अगस्त 2011, 21:49

इसे करने का एक तरीका यह है:
1. तालिका से सभी आईडी चुनें।
2. उन सभी को %hash में शामिल करना:
5 => 1
6 => 1
7 => 1
8 => 1
10 => 1

तो आपकी आईडी हैश की कुंजी है और मान 1 है।

  1. लूप के लिए बनाएं

के लिए (मेरा $i = 1; $i <11; $i++)
{
अगर($हैश{$i} != 1)
{
प्रिंट करें "आईडी $i गुम है \n";
}
}

यह पर्ल सिंटैक्स है, लेकिन PHP बहुत समान होना चाहिए।

2
Andrey 8 अगस्त 2011, 18:30

यदि आप डेटाबेस में पहली आईडी (और 'अस्थायी टेबल', 'फाइल सॉर्ट' और 'जॉइन बफर'):

SELECT
    a.id + 1 AS `From`,
    MIN(b.id - 1) AS `To`
FROM
    foo as a, foo as b
WHERE
    a.id < b.id
GROUP BY
    a.id
HAVING
    a.id < min(b.id) -1

स्वयं निहित उदाहरण:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// usually I create temporary tables for example scripts, but
// self-joins don't work on temp tables in mysql, bare me....
$pdo->exec('CREATE TABLE soFoo ( id int, primary key(id))');
$pdo->exec('INSERT INTO soFoo (id) VALUES (5),(6),(7),(8),(10),(15),(21)');

foreach( $pdo->query('
    SELECT
        a.id + 1 AS `From`,
        MIN(b.id - 1) AS `To`
    FROM
        foo as a, foo as b
    WHERE
        a.id < b.id
    GROUP BY
        a.id
    HAVING
        a.id < min(b.id) -1', PDO::FETCH_ASSOC) as $row
) {
    echo $row['From'], ' - ', $row['To'], "\n";
}

प्रिंट

9 - 9
11 - 14
16 - 20
2
VolkerK 8 अगस्त 2011, 18:46