Hello Sergei!
+create or replace table cars(id int primary key auto_increment, +price int, s date, e date, +period for p(s,e), +unique(id, p without overlaps)); +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +select * from cars; +id price s e +1 1000 2018-01-01 2020-01-01 +update cars for portion of p from '2019-01-01' to '2019-12-01' set
+# AUTO_INCREMENT field is both standalone and in WITHOUT OVERLAPS price= 1100;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
uhm, I don't know. I'd expect that here PRIMARY would define autoincrement values.
+truncate cars; +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +delete from cars for portion of p from '2019-12-10' to '2019-12-20'; +ERROR 23000: Duplicate entry '1' for key 'PRIMARY' +# AUTO_INCREMENT field is non-unique
not sure here. I think here unique should define autoincrement values. That is, in both cases, the most restrictive index should define.
+void TABLE::period_prepare_autoinc() +{ + if (!found_next_number_field) + return; + + key_map::Iterator it(found_next_number_field->part_of_key_not_clustered); + for (uint i; (i= it++) != key_map::Iterator::BITMAP_END;) + { + KEY &key= key_info[i]; + if (key.without_overlaps) + return; + }
No, I don't think you need to check *all* indexes that the field is part of. I believe you should only check the "main" index, the one that defines autoincrement field behavior. That is only
if (key_info[s->next_number_index].without_overlaps) return;
I don't understand the notion of the "autoincrement index". Why any index is important at all for an autoincrement field? Other than that, if next_number_index means the most restrictive one, it may make sense. -- Yours truly, Nikita Malyavin