@@ -382,14 +382,17 @@ def _build_create_table_sql(self, table_name: str) -> str:
382
382
indices : str = ""
383
383
384
384
self ._mysql_cur_dict .execute (f"SHOW COLUMNS FROM `{ table_name } `" )
385
+ rows : t .Sequence [t .Optional [t .Dict [str , RowItemType ]]] = self ._mysql_cur_dict .fetchall ()
385
386
386
- for row in self ._mysql_cur_dict .fetchall ():
387
+ primary_keys : int = sum (1 for row in rows if row is not None and row ["Key" ] == "PRI" )
388
+
389
+ for row in rows :
387
390
if row is not None :
388
391
column_type = self ._translate_type_from_mysql_to_sqlite (
389
392
column_type = row ["Type" ], # type: ignore[arg-type]
390
393
sqlite_json1_extension_enabled = self ._sqlite_json1_extension_enabled ,
391
394
)
392
- if row ["Key" ] == "PRI" and row ["Extra" ] == "auto_increment" :
395
+ if row ["Key" ] == "PRI" and row ["Extra" ] == "auto_increment" and primary_keys == 1 :
393
396
if column_type in Integer_Types :
394
397
sql += '\n \t "{name}" INTEGER PRIMARY KEY AUTOINCREMENT,' .format (
395
398
name = row ["Field" ].decode () if isinstance (row ["Field" ], bytes ) else row ["Field" ],
@@ -414,7 +417,7 @@ def _build_create_table_sql(self, table_name: str) -> str:
414
417
SELECT s.INDEX_NAME AS `name`,
415
418
IF (NON_UNIQUE = 0 AND s.INDEX_NAME = 'PRIMARY', 1, 0) AS `primary`,
416
419
IF (NON_UNIQUE = 0 AND s.INDEX_NAME <> 'PRIMARY', 1, 0) AS `unique`,
417
- IF (c.EXTRA = ' auto_increment', 1, 0) AS `auto_increment`,
420
+ { auto_increment}
418
421
GROUP_CONCAT(s.COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS `columns`,
419
422
GROUP_CONCAT(c.COLUMN_TYPE ORDER BY SEQ_IN_INDEX) AS `types`
420
423
FROM information_schema.STATISTICS AS s
@@ -424,8 +427,15 @@ def _build_create_table_sql(self, table_name: str) -> str:
424
427
AND s.COLUMN_NAME = c.COLUMN_NAME
425
428
WHERE s.TABLE_SCHEMA = %s
426
429
AND s.TABLE_NAME = %s
427
- GROUP BY s.INDEX_NAME, s.NON_UNIQUE, c.EXTRA
428
- """ ,
430
+ GROUP BY s.INDEX_NAME, s.NON_UNIQUE {group_by_extra}
431
+ """ .format (
432
+ auto_increment = (
433
+ "IF (c.EXTRA = 'auto_increment', 1, 0) AS `auto_increment`,"
434
+ if primary_keys == 1
435
+ else "0 as `auto_increment`,"
436
+ ),
437
+ group_by_extra = " ,c.EXTRA" if primary_keys == 1 else "" ,
438
+ ),
429
439
(self ._mysql_database , table_name ),
430
440
)
431
441
mysql_indices : t .Sequence [t .Optional [t .Dict [str , RowItemType ]]] = self ._mysql_cur_dict .fetchall ()
@@ -476,8 +486,8 @@ def _build_create_table_sql(self, table_name: str) -> str:
476
486
not in Integer_Types
477
487
for _type in types .split ("," )
478
488
):
479
- primary += "\n \t PRIMARY KEY ({})" .format (
480
- ", " .join (f'"{ column } "' for column in columns .split ("," ))
489
+ primary += "\n \t PRIMARY KEY ({columns })" .format (
490
+ columns = ", " .join (f'"{ column } "' for column in columns .split ("," ))
481
491
)
482
492
else :
483
493
indices += """CREATE {unique} INDEX IF NOT EXISTS "{name}" ON "{table}" ({columns});""" .format (
0 commit comments