source

절차를 사용하여 열의 기본값을 변경하는 방법

factcode 2022. 9. 17. 09:46
반응형

절차를 사용하여 열의 기본값을 변경하는 방법

현재 SQL은 다음과 같습니다.

DELIMITER $$
CREATE PROCEDURE updateDefaultUserRole(
    IN rid_in INT
) BEGIN
    ALTER TABLE _users
    MODIFY rid INT(255) NOT NULL DEFAULT rid_in; -- Modify the columns default value
    UPDATE _users SET rid = rid_in WHERE rid < rid_in; -- Update all entries lower than the role ID.
END $$
DELIMITER ;

데이터베이스 _users 테이블은 다음과 같습니다.

CREATE TABLE `_users` (
  `uid` int(255) NOT NULL,
  `forname` varchar(40) NOT NULL,
  `surname` varchar(40) NOT NULL,
  `email` varchar(120) NOT NULL,
  `hash` varchar(60) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `rid` int(255) NOT NULL DEFAULT '2'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `_users`
  ADD PRIMARY KEY (`uid`),
  ADD KEY `rid` (`rid`);
  MODIFY `uid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

이 에러가 발생하고 있습니다.

SQL 구문에 오류가 있습니다. MariaDB 서버 버전에 해당하는 설명서에서 'rid_in;' 근처에서 사용할 올바른 구문을 확인하십시오. -- 열의 기본값을 수정합니다.

다음 행에 대한 링크:

ALTER TABLE _users
MODIFY rid INT(255) NOT NULL DEFAULT rid_in;

이것을 변경하면,rid_in값:

ALTER TABLE _users
MODIFY rid INT(255) NOT NULL DEFAULT '1';

정상적으로 동작합니다만, 어떻게 하면,rid_in입력하시겠습니까?

출력을 사용하여 기본 사용자 역할 값을 변경하고 이전 사용자 값을 가진 모든 행을 새 사용자 역할로 업데이트할 수 있습니다.

CALL updateDefaultUserRole(@someInt)

각 사용자의 기본값을 업데이트할 수 있습니다.

여기서는 Dynamic SQL을 사용해야 합니다.Default의 조항Alter Table는 변수 값을 해결할 수 없습니다.

DELIMITER $$
CREATE PROCEDURE updateDefaultUserRole(
    IN rid_in INT
) BEGIN

    -- generate the query string for Alter Table
    SET @alter_query_str = CONCAT('ALTER TABLE _users
                                   MODIFY rid INT(255) NOT NULL 
                                   DEFAULT ', 
                                  rid_in); -- Modify the columns default value
    -- prepare the query
    PREPARE stmt FROM @alter_query_str;
    -- execute the query
    EXECUTE stmt;
    -- deallocate the query
    DEALLOCATE PREPARE stmt;

    UPDATE _users SET rid = rid_in 
    WHERE rid < rid_in; -- Update all entries lower than the role ID.

END $$
DELIMITER ;

언급URL : https://stackoverflow.com/questions/53144281/how-to-alter-the-default-value-of-a-column-using-a-procedure

반응형