sea_query/backend/mysql/
foreign_key.rs

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