sea_query/backend/mysql/
foreign_key.rs1use super::*;
2
3impl ForeignKeyBuilder for MysqlQueryBuilder {
4 fn prepare_table_ref_fk_stmt(&self, table_ref: &TableRef, sql: &mut impl SqlWriter) {
5 match table_ref {
6 TableRef::Table(TableName(None, _), None) => {
8 self.prepare_table_ref_iden(table_ref, sql)
9 }
10 _ => panic!("Not supported"),
11 }
12 }
13
14 fn prepare_foreign_key_drop_statement_internal(
15 &self,
16 drop: &ForeignKeyDropStatement,
17 sql: &mut impl SqlWriter,
18 mode: Mode,
19 ) {
20 if mode == Mode::Alter {
21 sql.write_str("ALTER TABLE ").unwrap();
22 if let Some(table) = &drop.table {
23 self.prepare_table_ref_fk_stmt(table, sql);
24 }
25 sql.write_str(" ").unwrap();
26 }
27
28 sql.write_str("DROP FOREIGN KEY ").unwrap();
29 if let Some(name) = &drop.foreign_key.name {
30 sql.write_char(self.quote().left()).unwrap();
31 sql.write_str(name).unwrap();
32 sql.write_char(self.quote().right()).unwrap();
33 }
34 }
35
36 fn prepare_foreign_key_create_statement_internal(
37 &self,
38 create: &ForeignKeyCreateStatement,
39 sql: &mut impl SqlWriter,
40 mode: Mode,
41 ) {
42 if mode == Mode::Alter {
43 sql.write_str("ALTER TABLE ").unwrap();
44 if let Some(table) = &create.foreign_key.table {
45 self.prepare_table_ref_fk_stmt(table, sql);
46 }
47 sql.write_str(" ").unwrap();
48 }
49
50 if mode != Mode::Creation {
51 sql.write_str("ADD ").unwrap();
52 }
53
54 sql.write_str("CONSTRAINT ").unwrap();
55 if let Some(name) = &create.foreign_key.name {
56 sql.write_char(self.quote().left()).unwrap();
57 sql.write_str(name).unwrap();
58 sql.write_char(self.quote().right()).unwrap();
59 }
60 sql.write_str(" FOREIGN KEY (").unwrap();
61
62 let mut fk_cols = create.foreign_key.columns.iter();
63
64 if let Some(col) = fk_cols.next() {
65 self.prepare_iden(col, sql);
66 }
67
68 for col in fk_cols {
69 sql.write_str(", ").unwrap();
70 self.prepare_iden(col, sql);
71 }
72
73 sql.write_str(") REFERENCES ").unwrap();
74 if let Some(ref_table) = &create.foreign_key.ref_table {
75 self.prepare_table_ref_fk_stmt(ref_table, sql);
76 }
77 sql.write_str(" (").unwrap();
78
79 let mut fk_ref_cols = create.foreign_key.ref_columns.iter();
80 if let Some(col) = fk_ref_cols.next() {
81 self.prepare_iden(col, sql);
82 }
83
84 for col in fk_ref_cols {
85 sql.write_str(", ").unwrap();
86 self.prepare_iden(col, sql);
87 }
88
89 sql.write_str(")").unwrap();
90
91 if let Some(foreign_key_action) = &create.foreign_key.on_delete {
92 sql.write_str(" ON DELETE ").unwrap();
93 self.prepare_foreign_key_action(foreign_key_action, sql);
94 }
95
96 if let Some(foreign_key_action) = &create.foreign_key.on_update {
97 sql.write_str(" ON UPDATE ").unwrap();
98 self.prepare_foreign_key_action(foreign_key_action, sql);
99 }
100 }
101}