الخلية:إضافة تسلسل عمود استنادا إلى حقل آخر

StackOverflow https://stackoverflow.com/questions/1600294

  •  05-07-2019
  •  | 
  •  

سؤال

أنا أعمل على بعض التعليمات البرمجية القديمة/قاعدة البيانات تحتاج إلى إضافة حقل إلى قاعدة البيانات التي سيتم تسجيل رقم تسلسل ذات الصلة إلى أن (الخارجية) معرف.

على سبيل المثال بيانات الجدول (الحالية):

ID     ACCOUNT     some_other_stuff
1      1           ...
2      1           ...
3      1           ...
4      2           ...
5      2           ...
6      1           ...

أنا بحاجة إلى إضافة sequenceid العمود الذي الزيادات بشكل منفصل لكل حساب ، تحقيق:

ID     ACCOUNT     SEQ     some_other_stuff
1      1           1       ...
2      1           2       ...
3      1           3       ...
4      2           1       ...
5      2           2       ...
6      1           4       ...

علما أن التسلسل هو ذات الصلة إلى حسابك.

هل هناك طريقة يمكنني تحقيق هذا في SQL, أو هل أنا اللجوء إلى السيناريو PHP للقيام بهذه المهمة لي ؟

تيا ، كيف

هل كانت مفيدة؟

المحلول

وهذا يجب أن تعمل ولكن ربما بطيئة:

CREATE temporary table seq ( id int, seq int);
INSERT INTO seq ( id, seq )
    SELECT id, 
      (SELECT count(*) + 1 FROM test c 
      WHERE c.id < test.id AND c.account = test.account) as seq 
    FROM test;

UPDATE test INNER join seq ON test.id = seq.id SET test.seq = seq.seq;

ولقد دعوت الجدول 'اختبار'؛ من الواضح أن يحتاج إلى أن يتم تعيين بشكل صحيح. لديك لاستخدام جدول مؤقت لأن الخلية لا تسمح لك استخدام subselect من الجدول نفسه الذي تقوم بتحديثه.

نصائح أخرى

السؤال هو الموسومة باسم "الخلية", لذا نعم, الخلية auto_increment يمكن أن تخلق groupwise متتابعة معرفات.
انظر http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html:

بالنسبة MyISAM و BDB الجداول يمكنك تحديد AUTO_INCREMENT على الثانوية عمود في متعددة-فهرس عمود.في هذه الحالة ولدت قيمة AUTO_INCREMENT عمود يتم احتساب MAX(auto_increment_column) + 1 WHERE prefix=given-prefix.وهذا مفيد عندما تريد وضع البيانات في مجموعات مرتبة.

تحرير:مثال البرنامج النصي php (باستخدام شركة تنمية نفط عمان, لكنه نفس اللعبة مع php-mysql وحدة)

$pdo = new PDO('mysql:host=...;dbname=...', '...', '...'); 
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

// example table
$pdo->exec(
  'CREATE TEMPORARY TABLE Foo (
    id int auto_increment,
    account int,
    someotherstuff varchar(32),
    primary key(account,id)
  ) engine=MyIsam'
);
// insert example data
$stmt = $pdo->prepare('INSERT INTO Foo (account,someotherstuff) VALUES (?,?)');
$stmt->execute(array(1, '1a'));
$stmt->execute(array(1, '1b'));
$stmt->execute(array(1, '1c'));
$stmt->execute(array(2, '2a'));
$stmt->execute(array(2, '2b'));
$stmt->execute(array(1, '1d'));
unset($stmt);

// query data
foreach( $pdo->query('SELECT account,id,someotherstuff FROM Foo') as $row ) {
  echo $row['account'], ' ', $row['id'], ' ', $row['someotherstuff'], "\n";
}

طباعة

1 1 1a
1 2 1b
1 3 1c
2 1 2a
2 2 2b
1 4 1d

وإنشاء الزناد:

CREATE TRIGGER trg_mytable_bi
BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
      DECLARE nseq INT;
      SELECT  COALESCE(MAX(seq), 0) + 1
      INTO    nseq
      FROM    mytable
      WHERE   account = NEW.account;
      SET NEW.seq = nseq;
END;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top