@@ -382,14 +382,17 @@ def _build_create_table_sql(self, table_name: str) -> str:
382382 indices : str = ""
383383
384384 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 ()
385386
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 :
387390 if row is not None :
388391 column_type = self ._translate_type_from_mysql_to_sqlite (
389392 column_type = row ["Type" ], # type: ignore[arg-type]
390393 sqlite_json1_extension_enabled = self ._sqlite_json1_extension_enabled ,
391394 )
392- if row ["Key" ] == "PRI" and row ["Extra" ] == "auto_increment" :
395+ if row ["Key" ] == "PRI" and row ["Extra" ] == "auto_increment" and primary_keys == 1 :
393396 if column_type in Integer_Types :
394397 sql += '\n \t "{name}" INTEGER PRIMARY KEY AUTOINCREMENT,' .format (
395398 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:
414417 SELECT s.INDEX_NAME AS `name`,
415418 IF (NON_UNIQUE = 0 AND s.INDEX_NAME = 'PRIMARY', 1, 0) AS `primary`,
416419 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}
418421 GROUP_CONCAT(s.COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS `columns`,
419422 GROUP_CONCAT(c.COLUMN_TYPE ORDER BY SEQ_IN_INDEX) AS `types`
420423 FROM information_schema.STATISTICS AS s
@@ -424,8 +427,15 @@ def _build_create_table_sql(self, table_name: str) -> str:
424427 AND s.COLUMN_NAME = c.COLUMN_NAME
425428 WHERE s.TABLE_SCHEMA = %s
426429 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+ ),
429439 (self ._mysql_database , table_name ),
430440 )
431441 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:
476486 not in Integer_Types
477487 for _type in types .split ("," )
478488 ):
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 ("," ))
481491 )
482492 else :
483493 indices += """CREATE {unique} INDEX IF NOT EXISTS "{name}" ON "{table}" ({columns});""" .format (
0 commit comments