الخلية:إضافة تسلسل عمود استنادا إلى حقل آخر
سؤال
أنا أعمل على بعض التعليمات البرمجية القديمة/قاعدة البيانات تحتاج إلى إضافة حقل إلى قاعدة البيانات التي سيتم تسجيل رقم تسلسل ذات الصلة إلى أن (الخارجية) معرف.
على سبيل المثال بيانات الجدول (الحالية):
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;