From 1d13bc330f481d46a069b4fbb23bd47534a90b8c Mon Sep 17 00:00:00 2001 From: fkmy Date: Tue, 12 Nov 2024 11:34:42 +0900 Subject: [PATCH] Fix identifier names exceeding 64 characters Since MySQL 8.0, the following error occurred when the table name is long. ERROR 1059 (42000) at line 115: Identifier name 'too_long_table_name_ibfk_1' is too long Ref: https://dev.mysql.com/doc/refman/8.0/en/identifier-length.html --- src/formatter/formatter.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/formatter/formatter.go b/src/formatter/formatter.go index c9a0eb3..9938e1c 100644 --- a/src/formatter/formatter.go +++ b/src/formatter/formatter.go @@ -2,20 +2,33 @@ package formatter import ( "fmt" + "strconv" "strings" "github.com/syucream/hakagi/src/constraint" ) const ( - baseSql = "ALTER TABLE %s ADD CONSTRAINT FOREIGN KEY (%s) REFERENCES %s(%s);" + baseSql = "ALTER TABLE %s ADD CONSTRAINT FOREIGN KEY (%s) REFERENCES %s(%s);" + customSql = "ALTER TABLE %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s(%s);" ) func FormatSql(constraints []constraint.Constraint) string { var queries []string - for _, c := range constraints { - q := fmt.Sprintf(baseSql, c.Table, c.Column, c.ReferedTable, c.ReferedColumn) + for i, c := range constraints { + var q string + + // If the table name is too long, the foreign key name will also be too long, + // and an error will occur if the foreign key name exceeds 64 characters. + // I think 4 digits is enough for numbering. + if len(c.Table) >= 56 { + fk_name := c.Table[:56] + "_fk_" + strconv.Itoa(i) + q = fmt.Sprintf(customSql, c.Table, fk_name, c.Column, c.ReferedTable, c.ReferedColumn) + } else { + q = fmt.Sprintf(baseSql, c.Table, c.Column, c.ReferedTable, c.ReferedColumn) + } + queries = append(queries, q) }