MySql에서 기본값으로 함수를 사용할 수 있습니까?
다음과 같이하고 싶습니다.
create table app_users
(
app_user_id smallint(6) not null auto_increment primary key,
api_key char(36) not null default uuid()
);
그러나 이로 인해 오류가 발생합니다. mysql에서 기본값에 대한 함수를 호출하는 방법이 있습니까?
감사.
아니, 할 수 없습니다.
그러나 다음과 같이이를 수행하는 트리거를 쉽게 만들 수 있습니다.
before_insert_app_users의 CREATE TRIGGER app_users에 삽입하기 전에 각 행 SET new.api_key = uuid ();
이미 언급했듯이 할 수 없습니다.
이 동작을 시뮬레이션하려면 다음과 같은 방식으로 트리거를 사용할 수 있습니다.
CREATE TRIGGER before_insert_app_users
BEFORE INSERT ON app_users
FOR EACH ROW
IF new.uuid IS NULL
THEN
SET new.uuid = uuid();
END IF;
다음과 같이 이전의 기존 행을 업데이트해야합니다.
UPDATE app_users SET uuid = (SELECT uuid());
현재 MySQL의 v8.0.13 이 필드에 대한 기본 값으로 식을 사용할 수 있습니다 :
DEFAULT 절에 지정된 기본값은 리터럴 상수 또는 식일 수 있습니다. 한 가지 예외를 제외하고 표현식 기본값을 괄호로 묶어 리터럴 상수 기본값과 구분합니다.
CREATE TABLE t1 (
uuid_field VARCHAR(32) DEFAULT (uuid()),
binary_uuid BINARY(16) DEFAULT (UUID_TO_BIN(UUID()))
);
안타깝게도 MySQL 5에는 기본값으로 상수가 필요합니다. 이 문제는 아래 링크에서 훨씬 더 자세히 논의되었습니다. 그러나 유일한 대답은 null을 허용하고 테이블 트리거를 추가하는 것입니다.
MySQL은 최근에야 UUID를 DB 패키지의 일부로 받아들였으며 우리가 원하는만큼 풍부한 기능이 아닙니다.
http://www.phpbuilder.com/board/showthread.php?t=10349169
나는 당신이 할 수 없다고 믿습니다 :
기본값은 상수 여야합니다. 함수 나 표현식이 될 수 없습니다.
위의 답변이 이전 버전인지 확실하지 않지만 unhex () 함수를 사용하여이 작업을 수행 할 수있는 곳을 보았습니다. 나는 그것을 시도하고 작동합니다. (마리아 db 버전 10.2)
넌 할 수있어
.... column_name binary(16) not null default unhex(replace(uuid(),'-',''))
그리고 그것은 작동합니다. uuid를 보려면 hex (column_name)을 수행하십시오.
MySQL의 UUID()
return CHAR(36)
및 UUID를 텍스트로 저장하는 것은 분명히 비효율적입니다. 대신 열은이어야하며 데이터를 삽입 하고 다시 읽을 때 BINARY(16)
사용할 수 있습니다 .UUID_TO_BIN()
BIN_TO_UUID()
CREATE TABLE app_users
(
app_user_id SMALLINT(6) NOT NULL AUTO_INCREMENT PRIMARY KEY,
api_key BINARY(16)
);
CREATE TRIGGER before_insert_app_users
BEFORE INSERT ON app_users
FOR EACH ROW
IF new.api_key IS NULL
THEN
SET new.api_key = UUID_TO_BIN(UUID());
END IF;
Note that since MySQL doesn't really know this is a UUID, it can be difficult to troubleshoot problems with it stored as binary. This article explains how to create a generated column that will convert the UUID to text as needed without taking up any space or worrying about keeping separate binary and text versions in sync: https://mysqlserverteam.com/storing-uuid-values-in-mysql-tables/
In MariaDB starting from version 10.2.1 you can. See its documentation.
CREATE TABLE test ( uuid BINARY(16) PRIMARY KEY DEFAULT unhex(replace(uuid(),'-','')) );
INSERT INTO test () VALUES ();
SELECT * FROM test;
참고URL : https://stackoverflow.com/questions/270309/can-i-use-a-function-for-a-default-value-in-mysql
'Development Tip' 카테고리의 다른 글
JS-base64 코드에서 이미지 너비와 높이 가져 오기 (0) | 2020.10.09 |
---|---|
다른 호스트간에 Docker 컨테이너를 이동하는 방법은 무엇입니까? (0) | 2020.10.09 |
HTML5 비디오 태그가있는 로컬 (하드 드라이브) 비디오 파일을 재생 하시겠습니까? (0) | 2020.10.08 |
파이썬의 re : 문자열에 정규식 패턴이 포함 된 경우 True 반환 (0) | 2020.10.08 |
요소 링크에 필수 속성 속성이 없습니다. (0) | 2020.10.08 |