首页 > 解决方案 > MariaDB 在创建外键时抛出语法错误

问题描述

CREATE DATABASE mylaboratory;

USE mylaboratory;

DROP TABLE IF EXISTS `Account`;

CREATE TABLE `Account` (
  `Email` varchar(255) NOT NULL COMMENT '계정 이메일 (ID)',
  `HashedPassword` longtext NOT NULL COMMENT '계정 암호화 된 비밀번호',
  `FullName` varchar(255) NOT NULL COMMENT '계정 성명',
  `AvatarImagePath` varchar(255) NOT NULL DEFAULT '/upload/Management/Profile/default-avatar.jpg' COMMENT '계정 아바타 이미지 경로',
  `Role` varchar(255) NOT NULL DEFAULT 'User' COMMENT '계정 역할 (Admin 또는 User)',
  `Locked` tinyint(1) NOT NULL COMMENT '계정 잠금',
  `LoginAttempt` int(11) NOT NULL COMMENT '로그인 시도 횟수',
  `EmailConfirmed` tinyint(1) NOT NULL COMMENT '이메일 확인 여부',
  `AgreedServiceTerms` tinyint(1) NOT NULL COMMENT '약관 동의 여부',
  `RegistrationToken` longtext DEFAULT NULL COMMENT '회원가입 인증 토큰',
  `ResetPasswordToken` longtext DEFAULT NULL COMMENT '비밀번호 찾기 인증 토큰',
  `Created` datetime(6) NOT NULL DEFAULT '1900-01-01 00:00:00.000000' COMMENT '계정 생성일',
  `Updated` datetime(6) NOT NULL DEFAULT '1900-01-01 00:00:00.000000' COMMENT '계정 업데이트일',
  `Message` longtext DEFAULT NULL COMMENT '계정 상태 메시지',
  `Deleted` tinyint(1) NOT NULL COMMENT '계정 삭제 여부',
  PRIMARY KEY (`Email`),
  CONSTRAINT `Accounts_check` CHECK (`Role` = 'Admin' or `Role` = 'User')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'MyLaboratory.Site 계정';

CREATE TABLE mylaboratory.Asset (
    Email varchar(255) NOT NULL COMMENT '계정 이메일 (ID)',
    ProductName varchar(255) NOT NULL COMMENT '상품명 (은행 계좌명, 증권 계좌명, 현금 등)',
    item varchar(255) NOT NULL COMMENT '항목 (자유입출금 자산, 신탁 자산, 현금 자산, 저축성 자산, 투자성 자산, 부동산, 동산, 기타 실물 자산, 보험 자산)',
    Amount BIGINT(255) NOT NULL COMMENT '금액',
    MonetaryUnit varchar(255) NOT NULL COMMENT '화폐 단위 (KRW, USD, ETC)',
    Created DATETIME(6) NOT NULL COMMENT '생성일',
    Updated DATETIME(6) NOT NULL COMMENT '업데이트일',
    Note varchar(255) NULL COMMENT '비고',
    Reserved0 varchar(100) NULL,
    Reserved1 varchar(100) NULL,
    Reserved2 varchar(100) NULL,
    Reserved3 varchar(100) NULL,
    Reserved4 varchar(100) NULL,
    PRIMARY KEY (Email, ProductName),
    KEY Asset_FK (Email),
    CONSTRAINT Asset_FK FOREIGN KEY (Email) REFERENCES mylaboratory.Account(Email)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci
COMMENT='계정 자산';

错误:

SQL查询执行期间发生错误

SQL 错误 [1005] [HY000]: (conn=61) Can't create table mylaboratoryasset(errno: 150 "外键约束格式不正确")

我无法弄清楚外键语法有什么问题。

MariaDB 10.2.38 版本。

标签: mariadb

解决方案


您不能将两个不同的字符集与外键一起使用,它们必须相同或至少兼容

CREATE TABLE Asset (
    Email varchar(255) NOT NULL COMMENT '계정 이메일 (ID)',
    ProductName varchar(255) NOT NULL COMMENT '상품명 (은행 계좌명, 증권 계좌명, 현금 등)',
    item varchar(255) NOT NULL COMMENT '항목 (자유입출금 자산, 신탁 자산, 현금 자산, 저축성 자산, 투자성 자산, 부동산, 동산, 기타 실물 자산, 보험 자산)',
    Amount BIGINT(255) NOT NULL COMMENT '금액',
    MonetaryUnit varchar(255) NOT NULL COMMENT '화폐 단위 (KRW, USD, ETC)',
    Created DATETIME(6) NOT NULL COMMENT '생성일',
    Updated DATETIME(6) NOT NULL COMMENT '업데이트일',
    Note varchar(255) NULL COMMENT '비고',
    Reserved0 varchar(100) NULL,
    Reserved1 varchar(100) NULL,
    Reserved2 varchar(100) NULL,
    Reserved3 varchar(100) NULL,
    Reserved4 varchar(100) NULL,
    PRIMARY KEY (Email, ProductName),
    KEY Asset_FK (Email),
    CONSTRAINT Asset_FK FOREIGN KEY (Email) REFERENCES Account(Email)
    )
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4

推荐阅读