mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-26 11:17:57 +08:00
Foreign key constraint symbol names must be unique in a database. To avoid violation errors the "Copy table" dialog should just leave the CONSTRAINT clause out from the CREATE TABLE code. In that case MySQL auto creates a valid name on demand. See http://www.heidisql.com/forum.php?t=6086
This commit is contained in:
@ -390,7 +390,7 @@ begin
|
||||
DataCols := DataCols + MainForm.mask(FColumns[Node.Index].Name) + ', ';
|
||||
end;
|
||||
nKeys: Clause := FKeys[Node.Index].SQLCode;
|
||||
nForeignkeys: Clause := FForeignKeys[Node.Index].SQLCode;
|
||||
nForeignkeys: Clause := FForeignKeys[Node.Index].SQLCode(False);
|
||||
else raise Exception.Create(SUnhandledNodeIndex);
|
||||
end;
|
||||
CreateCode := CreateCode + #9 + Clause + ',' + CRLF;
|
||||
|
@ -88,7 +88,7 @@ type
|
||||
Modified, Added, KeyNameWasCustomized: Boolean;
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
function SQLCode: String;
|
||||
function SQLCode(IncludeSymbolName: Boolean): String;
|
||||
end;
|
||||
TForeignKeyList = TObjectList<TForeignKey>;
|
||||
|
||||
@ -2560,11 +2560,15 @@ begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TForeignKey.SQLCode: String;
|
||||
function TForeignKey.SQLCode(IncludeSymbolName: Boolean): String;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Result := 'CONSTRAINT '+TMySQLConnection.QuoteIdent(KeyName)+' FOREIGN KEY (';
|
||||
Result := '';
|
||||
// Symbol names are unique in a db. In order to autocreate a valid name we leave the constraint clause away.
|
||||
if IncludeSymbolName then
|
||||
Result := 'CONSTRAINT '+TMySQLConnection.QuoteIdent(KeyName)+' ';
|
||||
Result := Result + 'FOREIGN KEY (';
|
||||
for i:=0 to Columns.Count-1 do
|
||||
Result := Result + TMySQLConnection.QuoteIdent(Columns[i]) + ', ';
|
||||
if Columns.Count > 0 then Delete(Result, Length(Result)-1, 2);
|
||||
|
@ -579,7 +579,7 @@ begin
|
||||
Specs.Add('DROP FOREIGN KEY '+Mainform.mask(DeletedForeignKeys[i]));
|
||||
for i:=0 to FForeignKeys.Count-1 do begin
|
||||
if FForeignKeys[i].Added or FForeignKeys[i].Modified then
|
||||
Specs.Add('ADD '+FForeignKeys[i].SQLCode);
|
||||
Specs.Add('ADD '+FForeignKeys[i].SQLCode(True));
|
||||
end;
|
||||
|
||||
Result := 'ALTER TABLE '+Mainform.mask(DBObject.Name) + CRLF + #9 + ImplodeStr(',' + CRLF + #9, Specs);
|
||||
@ -617,7 +617,7 @@ begin
|
||||
end;
|
||||
|
||||
for i:=0 to FForeignKeys.Count-1 do
|
||||
Result := Result + #9 + FForeignKeys[i].SQLCode + ','+CRLF;
|
||||
Result := Result + #9 + FForeignKeys[i].SQLCode(True) + ','+CRLF;
|
||||
|
||||
if Integer(listColumns.RootNodeCount) + IndexCount + FForeignKeys.Count > 0 then
|
||||
Delete(Result, Length(Result)-2, 3);
|
||||
|
Reference in New Issue
Block a user