-- Active: 1697134738767@@localhost@3306@ml_system
-- Admita que pretende registar numa tabela de uma base de dados
-- o email dos utilizadores de um sistema de informação.
-- Para fazer o registo utiliza a seguinte declaração SQL
INSERT INTO tb_username (username) VALUES ('admin');
-- Table 'ml_system.tb_username' doesn't exist
-- Como não tem a estrutura da tabela criada, recebe o erro
-- Para resolver este problema terá de criar uma tabela
-- que guardará os registos de username.
-- Para evitar erros de criação, antes de criarmos removemos a
-- tabela já existente
DROP TABLE IF EXISTS tb_username;
-- AffectedRows : 0
CREATE TABLE
tb_username(
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
dataReg TIMESTAMP
);
-- AffectedRows : 0
DESCRIBE tb_username;
TRUNCATE tb_username;
-- AffectedRows : 0
SELECT * FROM tb_username;
INSERT INTO tb_username (username) VALUES ('admin');
-- AffectedRows : 1
SELECT * FROM tb_username;
INSERT INTO tb_username (username) VALUES ('admin');
-- Duplicate entry 'admin' for key 'username'
-- Isto sucede pois o campo username tem a chave UNIQUE
-- e como tal não pode ser duplicado.
-- Podemos evitar este problema, testando antes de registar.
SELECT COUNT(id) FROM tb_username WHERE username = 'admin';
-- E ao testarmos desta forma ficamos a saber se já existe o registo ou não.
-- O SQL tem estruturas que nos permitem condicionar ações
-- Podemos fazê-lo através de funções ou procedimentos.
-- Procedimento para registar
DROP FUNCTION IF EXISTS F1_TESTAR_USERNAME;
CREATE FUNCTION F1_TESTAR_USERNAME(a TEXT) RETURNS text
BEGIN
DECLARE res text;
DECLARE total int;
SET total = (SELECT COUNT(id) FROM tb_username WHERE username = a);
IF total = 1 THEN SET res = 'no';
ELSE
SET res = a;
END IF;
RETURN res;
END;
DROP FUNCTION IF EXISTS F1_REGISTAR_USERNAME;
CREATE FUNCTION F1_REGISTAR_USERNAME(a TEXT) RETURNS BOOLEAN
BEGIN
DECLARE res BOOLEAN;
IF a = 'no' THEN
SET res = FALSE;
ELSE
INSERT INTO tb_username (username) VALUES (a);
SET res = TRUE;
END IF;
RETURN res;
END;
DROP PROCEDURE IF EXISTS P_TESTAR_REGISTAR_USER;
CREATE PROCEDURE P_TESTAR_REGISTAR_USER(IN a text)
BEGIN
SELECT F1_REGISTAR_USERNAME(F1_TESTAR_USERNAME(a)) AS resultado;
END;
CALL P_TESTAR_REGISTAR_USER('admin');
Sem comentários:
Enviar um comentário