A version of JD Schmidt's answer, but without the awkwardness of an extra column:

    CREATE TABLE foo (
      FieldA INT,
      FieldB INT
    );
    
    DELIMITER //
    CREATE TRIGGER InsertFieldABNotNull BEFORE INSERT ON foo
    FOR EACH ROW BEGIN
      IF (NEW.FieldA IS NULL AND NEW.FieldB IS NULL) THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = '\'FieldA\' and \'FieldB\' cannot both be null';
      END IF;
    END//
    CREATE TRIGGER UpdateFieldABNotNull BEFORE UPDATE ON foo
    FOR EACH ROW BEGIN
      IF (NEW.FieldA IS NULL AND NEW.FieldB IS NULL) THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = '\'FieldA\' and \'FieldB\' cannot both be null';
      END IF;
    END//
    DELIMITER ;
    
    INSERT INTO foo (FieldA, FieldB) VALUES (NULL, 10); -- OK
    INSERT INTO foo (FieldA, FieldB) VALUES (10, NULL); -- OK
    INSERT INTO foo (FieldA, FieldB) VALUES (NULL, NULL); -- gives error
    UPDATE foo SET FieldA = NULL; -- gives error