Saya ingin melakukan sesuatu seperti ini:
create table app_users
(
app_user_id smallint(6) not null auto_increment primary key,
api_key char(36) not null default uuid()
);
Namun ini menghasilkan kesalahan, apakah ada cara untuk memanggil fungsi untuk nilai default di mysql?
Terima kasih.
SET new.api_key = COALESCE(new.api_key, uuid())
untuk melestarikan nilai-nilai yang ada.Pada mysql v8.0.13 dimungkinkan untuk menggunakan ekspresi sebagai nilai default untuk bidang:
CREATE TABLE t1 ( uuid_field VARCHAR(32) DEFAULT (uuid()), binary_uuid BINARY(16) DEFAULT (UUID_TO_BIN(UUID())) );
sumber
varchar(32)
harusvarchar(36)
Seperti yang sudah disebutkan, Anda tidak bisa.
Jika Anda ingin menyimulasikan perilaku ini, Anda dapat menggunakan pemicu dengan cara ini:
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;
Anda masih harus memperbarui baris yang ada sebelumnya, seperti ini:
UPDATE app_users SET uuid = (SELECT uuid());
sumber
Sayangnya tidak, MySQL 5 membutuhkan konstanta sebagai default. Masalah ini dibahas lebih rinci dalam tautan di bawah ini. Tetapi satu-satunya jawaban adalah mengizinkan null dan menambahkan pemicu tabel.
MySQL baru-baru ini menerima UUID sebagai bagian dari paket DB mereka, dan itu tidak sekaya fitur yang kami inginkan.
http://www.phpbuilder.com/board/showthread.php?t=10349169
sumber
Saya yakin Anda tidak bisa :
sumber
getdate()
bahkan bukan fungsi MySQL. Tautan di jawaban menjelaskan satu-satunya pengecualian: «Anda dapat menentukan CURRENT_TIMESTAMP sebagai default untuk kolom TIMESTAMP» .Perhatikan bahwa
UUID()
pengembalian MySQLCHAR(36)
, dan menyimpan UUID sebagai teks (seperti yang ditunjukkan pada jawaban lain) jelas tidak efisien. Sebagai gantinya, kolomnya harusBINARY(16)
, dan Anda dapat menggunakanUUID_TO_BIN()
saat memasukkan data danBIN_TO_UUID()
saat membacanya kembali.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;
Perhatikan bahwa karena MySQL tidak benar-benar tahu bahwa ini adalah UUID, mungkin sulit untuk memecahkan masalah jika disimpan sebagai biner. Artikel ini menjelaskan cara membuat kolom yang dihasilkan yang akan mengubah UUID menjadi teks sesuai kebutuhan tanpa menghabiskan ruang apa pun atau mengkhawatirkan sinkronisasi versi biner dan teks: https://mysqlserverteam.com/storing-uuid-values-in -mysql-tables /
sumber
Saya tidak yakin apakah jawaban di atas adalah untuk versi yang lebih lama, tetapi saya melihat di suatu tempat Anda dapat melakukan ini menggunakan fungsi unhex (). Saya mencobanya dan berhasil. (maria db versi 10.2)
Anda dapat melakukan
.... column_name binary(16) not null default unhex(replace(uuid(),'-',''))
dan berhasil. Untuk melihat uuid cukup lakukan hex (nama_kolom).
sumber
Di MariaDB mulai dari versi 10.2.1 Anda bisa. Lihat dokumentasinya .
CREATE TABLE test ( uuid BINARY(16) PRIMARY KEY DEFAULT unhex(replace(uuid(),'-','')) ); INSERT INTO test () VALUES (); SELECT * FROM test;
sumber