سؤال

أحاول نقل طاولة تحتوي على مليارات الصفوف إلى دليل جديد في MySQL 5.6. أحاول نسخ Table1 إلى Table2 وهناك عن طريق إسقاط Table1 ثم إعادة تسمية Table2 إلى Table1.

    CREATE TABLE `table2` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `col1` int(11) DEFAULT NULL,
  `col2` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_col1_col2` (`col1`,`col2`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 DATA DIRECTORY='/mysql_data/';

أنا أستخدم الإجراء أدناه للقيام بالنسخ.

DROP PROCEDURE IF EXISTS copytables;
CREATE PROCEDURE `copytables`()
begin
DECLARE v_id INT(11) unsigned  default 0;
declare maxid int(11) unsigned  default 0;
select max(id) into maxid from table1;
while v_id < maxid  do
insert into table2(col1,col2)
select fbpost_id,fbuser_id from table1 where id >= v_id and id <v_id+100000 ;
set v_id=v_id+100000;
select v_id;
select max(id) into maxid from table1;
select maxid;
end while;
end;

لكنني الآن أحصل على فجوات في عمود المعرف بعد كل دفعة من 100000 في Table2 (بعد المعرف 199999 المعرف التالي هو 262141). لا يحتوي Table1 على أي فجوات في عمود ID.

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

المحلول

اسأل جوجل: https://www.google.com/search؟q=AUTO_INCREMENT+MYSQL+GAPS+INNODB ال النتيجة الأولى يشرح هذه القضية.

بشكل عام ، يجب أن تكون قادرًا على إخبار الناس بما جربته حتى الآن ولماذا لا يعمل. في هذه الحالة ، هذه مجرد ميزة/سمة من سمات محرك InnoDB الذي يتيح له العمل بسرعة بكميات كبيرة.

نصائح أخرى

لا تضمن حقول الزيادات التلقائية أن تكون كثيفة ، فهي مضمونة فقط لمنحك قيمًا فريدة. عادة سيفعل ذلك من خلال منحك قيمًا كثيفة (متتالية) ، لكن ليس من الضروري ذلك. سيحتفظ بعدد من القيم ، والتي يمكن تجاهلها إذا لم يتم استخدامها. نرى http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top