আমি কি মাইএসকিএলে একটি ডিফল্ট মানের জন্য একটি ফাংশন ব্যবহার করতে পারি?


95

আমি এরকম কিছু করতে চাই:


create table app_users
(
    app_user_id smallint(6) not null auto_increment primary key,
    api_key     char(36) not null default uuid()
);

তবে এটির ত্রুটির ফলস্বরূপ, মাইএসকিএল-তে কোনও ডিফল্ট মানের জন্য কোনও ফাংশন কল করার কোনও উপায় আছে?

ধন্যবাদ

উত্তর:


130

না, আপনি পারবেন না।

তবে আপনি সহজেই এটি করতে একটি ট্রিগার তৈরি করতে পারেন, যেমন:

ট্রিগারটি তৈরি করুন_আর_সামান্য_আপ_ ব্যবহারকারীদের আগে
  অ্যাপ_ব্যবহারকারীদের প্রবেশের আগে 
  প্রতিটি সারি জন্য
  SET new.api_key = uuid ();

4
@See stackoverflow.com/questions/6280789/... বিদ্যমান সারিতে UUID জানা পূর্ণ জন্য।
স্যাম বার্নুম

4
এটি একটি ডিফল্ট মান থাকার মতো নয়। মানটি যদি নুল হত তবে একজন কীভাবে এই উত্তরটি কী কী সেট করতে পারবেন?
টুলমেকারস্টেভ

4
দুঃখের বিষয় যে মাইএসকিউএল এটি যত দিন ধরে রয়েছে তবে আপনি ট্রিগার ছাড়াই কোনও কলামের জন্য একটি ডিফল্ট ইউআইডি প্রয়োগ করতে পারবেন না। এর কারণটি 1980 এর প্রযুক্তিতে এম্বেড করা রয়েছে যা স্পষ্টতই মাইএসকিউএল বেস কোডে বিদ্যমান রয়েছে ("আমাদের কাছে ভাল জিনিস থাকতে পারে না" সন্ধান করুন): পেরকোনা
2013/04/08

4
@ রডলভেলাসো ইউইউইড ফাংশনটি অত্যন্ত সংঘর্ষ প্রতিরোধী হিসাবে নির্মিত। এমডি 5 এর চেয়ে অনেক বেশি। ইউউইডকে এমডি 5 করার সাথে সাথে আপনার আইডি সংঘর্ষের ঝুঁকি বেশি
ক্র্যাঙ্কার

4
SET new.api_key = COALESCE(new.api_key, uuid())বিদ্যমান মান সংরক্ষণ করতে।
রায়ান

33

এর মতো মাইএসকিউএল v8.0.13 এটি একটি ক্ষেত্রের জন্য একটি ডিফল্ট মান যেমন একটি অভিব্যক্তি ব্যবহার করা সম্ভব:

একটি ডিফল্ট ধারায় নির্দিষ্ট করা ডিফল্ট মান আক্ষরিক ধ্রুবক বা একটি অভিব্যক্তি হতে পারে। একটি ব্যতিক্রম সহ, আক্ষরিক ধ্রুবক ডিফল্ট মানগুলি থেকে পৃথক করার জন্য বন্ধনীগুলির মধ্যে এক্সপ্রেশন ডিফল্ট মানগুলি বন্ধ করুন।

CREATE TABLE t1 (
  uuid_field     VARCHAR(32) DEFAULT (uuid()),
  binary_uuid    BINARY(16)  DEFAULT (UUID_TO_BIN(UUID()))
);

4
মনে রাখবেন যে উত্তরে ইতিমধ্যে সংযুক্ত ডক্স অনুসারে: ... সঞ্চিত ফাংশন এবং ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির অনুমতি নেই । অর্থাৎ, কেবলমাত্র ফাংশন যা ডিফল্ট এক্সপ্রেশন হিসাবে ব্যবহার করা যায় সেগুলি অন্তর্নির্মিত ফাংশন।
আশেরবার

4
2020 সালের মে হিসাবে এটি সঠিক উত্তর হওয়া উচিত। ট্রিগার ব্যবহার করে অন্য উত্তরগুলি অপ্রচলিত।
জন স্টক

একটি গৌণ বিশদ: varchar(32)হওয়া উচিতvarchar(36)
জারেড বেক

@ জারেডবেক আমার মনে হয় আপনি যদি ড্যাশগুলি সংরক্ষণ না করেন তবে 32 টি ভাল is
অ্যালভিন থম্পসন

@ জনস্টক এই পদ্ধতিটি ব্যবহারকারী-সংজ্ঞায়িত বা সঞ্চিত ক্রিয়াকলাপগুলির ব্যবহারের অনুমতি দেয় না তাই ট্রিগারগুলির অপ্রচলিত ব্যবহার ঘোষণা করা কিছুটা অকাল হতে পারে।
অ্যালভিন থম্পসন

21

ইতিমধ্যে বলেছে আপনি পারবেন না।

আপনি যদি এই আচরণটি অনুকরণ করতে চান তবে আপনি এইভাবে ট্রিগার ব্যবহার করতে পারেন:

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());

9

দুর্ভাগ্যক্রমে না, মাইএসকিউএল 5 এর জন্য ডিফল্টর জন্য ধ্রুবক প্রয়োজন। বিষয়টি নীচের লিঙ্কটিতে আরও বিস্তারিতভাবে আলোচনা করা হয়েছিল। তবে একমাত্র উত্তর হ'ল নালকে অনুমতি দেওয়া এবং একটি টেবিল ট্রিগার যুক্ত করা।

মাইএসকিউএল সম্প্রতি সম্প্রতি তাদের ডিবি প্যাকেজের অংশ হিসাবে ইউআইডি গ্রহণ করেছে, এবং এটি আমাদের পছন্দ মতো বৈশিষ্ট্যযুক্ত নয়।

http://www.phpbuilder.com/board/showthread.php?t=10349169


4
আমার যুক্ত করা উচিত যে নুলকে অনুমতি দেওয়া এবং ট্রিগারগুলির উপর নির্ভর করা কাজ করতে পারে তবে বেশিরভাগ বিকাশকারীরা এটিকে খুব হ্যাক-ওয়াই সমাধান হিসাবে বিবেচনা করবে। আমি ব্যক্তিগতভাবে এটি সুপারিশ করব না প্রতিটি তাদের নিজস্ব।
ট্র্যাভিসো

7

আমি বিশ্বাস করি আপনি পারবেন না :

ডিফল্ট মান অবশ্যই একটি ধ্রুবক হতে হবে; এটি কোনও ফাংশন বা এক্সপ্রেশন হতে পারে না


সত্য নয়, আপনি getdate ()
amr ওসামা

6
@ আমরোসামা - না, আপনি পারবেন না। getdate()এমনকি একটি মাইএসকিউএল ফাংশন নয়। উত্তর লিংকে একমাত্র ব্যতিক্রম ব্যাখ্যা করেছেন: «আপনি একটি TIMESTAMP এ কলামের জন্য ডিফল্ট হিসাবে CURRENT_TIMESTAMP নির্দিষ্ট করতে পারেন»
vlvaro González

4
CURRENT_TIMESTAMP হ'ল "ফাংশন" যা ডিফল্ট মান হিসাবে ব্যবহার করা যেতে পারে। অন্য সব কিছুই অবশ্যই একটি ধ্রুবক হতে হবে (দুর্ভাগ্যক্রমে)।
ট্রয় মোরহাউস

4
প্রযুক্তিগতভাবে আমি বলব যে গতিরূপে একটি ডিফল্ট মান সেট করতে AUTO_INCREMENT কে "ফাংশন" হিসাবেও দেখা যেতে পারে।
রিকেলাস

1

নোট করুন যে মাইএসকিউএলের UUID()রিটার্ন CHAR(36), এবং ইউআইডিগুলিকে পাঠ্য হিসাবে সংরক্ষণ করা (অন্য উত্তরগুলিতে দেখানো হয়েছে) স্পষ্টতই অদক্ষ। পরিবর্তে, কলামটি হওয়া উচিত 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;

নোট করুন যেহেতু মাইএসকিউএল সত্যিই জানেন না এটি একটি ইউইউডি, তাই এটি বাইনারি হিসাবে সঞ্চিত সমস্যাগুলির সমস্যা সমাধানের পক্ষে সমস্যা হতে পারে। এই নিবন্ধটি ব্যাখ্যা করে যে কোনও উত্পন্ন কলাম কীভাবে তৈরি করতে হবে যা কোনও স্থান না নিয়ে বা পৃথক বাইনারি এবং পাঠ্য সংস্করণ সিঙ্কে রাখার বিষয়ে চিন্তা না করে প্রয়োজনীয় হিসাবে পাঠ্যগুলিতে রূপান্তর করবে: https://mysqlserverteam.com/storing-uuid-values-in -মাইএসকিউএল-টেবিল /


0

উপরের উত্তরগুলি পুরানো সংস্করণের জন্য কিনা তা আমি নিশ্চিত নই, তবে আমি কোথাও দেখেছি যে আপনি আনহেক্স () ফাংশনটি ব্যবহার করে এটি করতে পারেন। আমি এটি চেষ্টা করেছিলাম এবং এটি কাজ করে। (মারিয়া ডিবি সংস্করণ 10.2)

আপনি করতে পারেন

.... column_name binary(16) not null default unhex(replace(uuid(),'-',''))   

এবং এটি কাজ করে। ইউইডি দেখতে কেবল হেক্স (কলাম_নাম) করুন।


0

মারিয়াডিবিতে 10.2.1 সংস্করণ থেকে শুরু করতে পারেন। এর ডকুমেন্টেশন দেখুন ।

CREATE TABLE test ( uuid BINARY(16) PRIMARY KEY DEFAULT unhex(replace(uuid(),'-','')) );
INSERT INTO test () VALUES ();
SELECT * FROM test;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.