diff --git a/ddl/db_integration_test.go b/ddl/db_integration_test.go index 039c749cb28b5..52fd0f40a208f 100644 --- a/ddl/db_integration_test.go +++ b/ddl/db_integration_test.go @@ -1590,6 +1590,14 @@ func (s *testIntegrationSuite4) TestAlterColumn(c *C) { _, err = s.tk.Exec("alter table t1 modify column c bigint;") c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "[ddl:1071]Specified key was too long; max key length is 3072 bytes") + + s.tk.MustExec("drop table if exists multi_unique") + s.tk.MustExec("create table multi_unique (a int unique unique)") + s.tk.MustExec("drop table multi_unique") + s.tk.MustExec("create table multi_unique (a int key primary key unique unique)") + s.tk.MustExec("drop table multi_unique") + s.tk.MustExec("create table multi_unique (a int key unique unique key unique)") + s.tk.MustExec("drop table multi_unique") } func (s *testIntegrationSuite) assertWarningExec(c *C, sql string, expectedWarn *terror.Error) { diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index 17853505179ba..91be4e5fda7da 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -507,13 +507,19 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o case ast.ColumnOptionAutoIncrement: col.Flag |= mysql.AutoIncrementFlag case ast.ColumnOptionPrimaryKey: - constraint := &ast.Constraint{Tp: ast.ConstraintPrimaryKey, Keys: keys} - constraints = append(constraints, constraint) - col.Flag |= mysql.PriKeyFlag + // Check PriKeyFlag first to avoid extra duplicate constraints. + if col.Flag&mysql.PriKeyFlag == 0 { + constraint := &ast.Constraint{Tp: ast.ConstraintPrimaryKey, Keys: keys} + constraints = append(constraints, constraint) + col.Flag |= mysql.PriKeyFlag + } case ast.ColumnOptionUniqKey: - constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Name: colDef.Name.Name.O, Keys: keys} - constraints = append(constraints, constraint) - col.Flag |= mysql.UniqueKeyFlag + // Check UniqueFlag first to avoid extra duplicate constraints. + if col.Flag&mysql.UniqueFlag == 0 { + constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Keys: keys} + constraints = append(constraints, constraint) + col.Flag |= mysql.UniqueKeyFlag + } case ast.ColumnOptionDefaultValue: hasDefaultValue, err = setDefaultValue(ctx, col, v) if err != nil {